Библиотека GD поддерживает также работу
Библиотека GD поддерживает также работу со шрифтами PostScript и TrueType. Для того чтобы заработали приведенные ниже функции, PHP должен быть откомпилирован и установлен вместе с библиотекой FreeType, доступной по адресу http://www.freetype.org. В Windows-версии PHP она установлена по умолчанию.
imageTTFText
Рисование текста шрифтом TrueType.
Синтаксис :
array imageTTFText(int im, int size, int angle, int x, int y, int color, string fontfile, string text)
Эта функция помещает строку text в изображение im цветом color. Как обычно, color
должен представлять собой допустимый идентификатор цвета. Параметр angle
задает угол наклона в градусах выводимой строки, отсчитываемой от горизонтали против часовой стрелки. Координаты (x, y) указывают положение так называемой базовой точки строки (обычно это ее левый нижний угол). Параметр size задает размер шрифта, который будет использоваться при выводе строки. fontfile должен содержать имя TTF-файла, в котором и храниться шрифт.
Функция возвращает список из 8 элементов. Первая их пара задает координаты (x,y) верхнего левого угла прямоугольника, описанного вокруг строки текста в изображении, вторая пара - координаты верхнего правого угла, и т.д. Так как в общем случае строка может иметь любой наклон angle, здесь требуются 4 пары координат.
Строка текста text
может содержать символьные последовательности UTF-8 (в виде {) для вывода символов с кодами, большими 255.
При использовании отрицательного значения индекса цвета color отключается сглаживание шрифта (antialiasing).
Данная функция требует библиотеке GD и FreeType.
<?php header("Content-type: image/jpeg"); $im = imagecreate(400, 30); $white = imagecolorallocate($im, 255, 255, 255); $black = imagecolorallocate($im, 0, 0, 0); // Replace path by your own font path imagettftext($im, 20, 0, 10, 20, $black, "/path/arial.ttf", "Testing... Omega: Ω"); imagejpeg($im); imagedestroy($im);?>
Следующий пример выводит строку по центру рисунка
<?php$gi = imageCreate(200,100);$bg = imageColorAllocate($gi,0,220,0);$tx = imageColorAllocate($gi,25,2,228);$w = imageSX($gi); // ширина рисунка$h = imageSY($gi); // высота рисункаimageFilledRectangle($gi,0,0,$w,$h,$bg); $szf = 20; // размер шрифта$ang = 240; // угол поворота строки$str = "Heyou"; // текст строки$font = "symbol.ttf" // файл шрифта$sz = imageTTFBBox($szf,$ang,$font,$str);$sdx = $sz[4]/2;$sdy = ($sz[7]+$sz[3])/2;imageTTFText($gi,$szf,$ang,$w/2-$sdx,$h/2-$sdy,$tx,$font,$str);Header("Content-Type: image/png");imagePng($gi,"file.png");?>
imageTTFBBox
Расчет площади, занимаемой строкой шрифта TrueType.
Синтаксис :
attay imageTTFBBox(int size, int angle, string fontfile, string text)
Эта функция ничего не выводит в изображение, а просто определяет, какой размер и положение заняла бы строка текста text размера size, выведенная под углом angle
в какой-нибудь рисунок. Параметр fontfile задает абсолютный путь к файлу шрифта, который будет использован при выводе.
Возвращаемый список содержит всю информацию о размерах строки в формате, похожем на тот, что выдает функция imageTTFText(). Однако порядок точек в нем отличается.
Содержимое массива, возвращаемого функцией imageTTFBBox():
0 и 1 - (x,y) левого нижнего угла
2 и 3 - (x,y) правого нижнего угла
4 и 5 - (x,y) правого верхнего угла
6 и 7 - (x,y) левого верхнего угла
Координаты могут иметь отрицательные значения.
Функция требует библиотеки GD и FreeType.
imagePSLoadFont
Загрузка из файла шрифта PostScript Type 1.
Синтаксис :
int imagePSLoadFont(string filename)
Возвращает дескриптор загруженного шрифта или FALSE при ошибке (также выводится предупреждение).
<?phpheader("Content-type: image/jpeg");$im = imagecreate(350, 45);$black = imagecolorallocate($im, 0, 0, 0);$white = imagecolorallocate($im, 255, 255, 255);$font = imagepsloadfont("bchbi.pfb"); // or locate your .pfb files on your machineimagepstext($im, "Testing... It worked!", $font, 32, $white, $black, 32, 32);imagepsfreefont($font);imagejpeg($im, "", 100); //for best quality...your mileage may varyimagedestroy($im);?>
Эта функция доступна только в том случае, если PHP был скомпилирован с опцией --enable-t1lib.
imagePSFreeFont
Выгрузка шрифта PostScript Type 1.
Синтаксис :
void imagePSFreeFont(int fontindex)
Данная функция освобождает память от шрифта, заданного параметром fontindex.
Эта функция доступна только в том случае, если PHP был скомпилирован с опцией --enable-t1lib.
imagePSEncodeFont
Установка схемы перекодировки текста.
Синтаксис :
int imagePSEncodeFont(int font_ndex, string encodingfile)
Загружает файл перекодировки encodingfile для шрифта font_index. Поскольку шрифты PostScript по умолчанию не используют символы с кодами, большими 127, перекодировка требуется при необходимости использования не английского языка. Формат файла описан в документации Tllibs, также с библиотекой поставляются 2 готовых файла: IsoLatinl.enc и IsoL.atin2.enc.
Если перекодировка используется постоянно, установите параметр ps.default_encoding в файле конфигурации со значением имени файла перекодировки, который будет загружаться автоматически.
Эта функция доступна только в том случае, если PHP был скомпилирован с опцией --enable-t1lib.
imagePsExtendFont
Масштабирование шрифта.
Синтаксис :
bool imagePsExtendFont (int font_index, float extend)
Функция производит растяжение или сжатие шрифта, заданного параметром font_index до размера, заданного параметром extend.
Если значение параметра extend меньше 1, то шрифт будет уменьшаться.
Эта функция доступна только в том случае, если PHP был скомпилирован с опцией --enable-t1lib.
imagePsSlantFont
Установка наклона шрифта.
Синтаксис :
bool imagePsSlantFont(int font_index, double slant)
Фукнция устанавливает наклон шрифта font_index в значение, заданное параметром slant.
Эта функция доступна только в том случае, если PHP был скомпилирован с опцией --enable-t1lib.
imagePSBBox
Расчет площади, занимаемой строкой шрифта PostScript Type 1.
Синтаксис :
array imagePSBBox( string text, int font, int size [, int space [, int tightness [, float angle]]])
Расчеты производятся на основании аргументов:
size - размер шрифта в пикселах;
space — изменение размера пробелов по отношению к нормальному (может быть отрицательным);
tightness — промежутки между символами по отношении) к нормальному (может быть отрицательным);
angle — угол наклона строки в градусах.
Значения space и tightness
измеряются в долях пробела (1/1000).
Аргументы space, tightness, angle не обязательны.
Результаты расчета недостаточно точны. Функция возвращает массив:
0 - нижний левый угол, Х-координата;
1 - нижний левый угол, Y-координата;
2 - верхний правый угол, Х-координата;
3 - верхний правый угол, Y- координата.
Эта функция доступна только в том случае, если PHP был скомпилирован с опцией --enable-t1lib.
imagePSText
Вывод текста поверх рисунка шрифтом PostScript Type 1.
Синтаксис :
array imagePSText ( resource image, string text, int font, int size, int foreground, int background, int x, int y [, int space [, int tightness [, float angle [, int antialias_steps]]]])
Параметр size
задает размер шрифта.
Координаты x, у указывают левый нижний угол первого символа.
Аргументами foreground и background задаются цвета текста и фона (фон необходим только для сглаживания шрифта).
Аргумент antialias_steps позволяет указать число цветов, используемых при сглаживании текста (допустимые значения 4 и 16). Для шрифтов размером меньше 20 используйте большее значение, так как это улучшает читабельность; для больших шрифтов используйте меньшее значение, так как это увеличивает быстродействие.
Параметр angle задает наклон текста в градусах.
Функция возвращает массив, подобно imagepsbbox().
Эта функция доступна только в том случае, если PHP был скомпилирован с опцией --enable-t1lib.
Размещение рисунков
pdf_open_gif
Открытие рисунка GIF.
Синтаксис :
void pdf_open_gif(int pdf_document, string filename)
Используйте функцию pdf_open_image_file().
<?php$im = pdf_open_gif($pdf, "test.gif");pdf_place_image($pdf, $im, 100, 100, 1);pdf_close_image($pdf, $im);?>
pdf_open_png
Открытие рисунка PNG.
Синтаксис :
void pdf_open_png(int pdf_document, string filename)
Используйте функцию pdf_open_image_file().
pdf_open_jpeg
Открытие рисунка JPEG.
Синтаксис :
void pdf_open_jpeg(int pdf_document, string filename)
Используйте функцию pdf_open_image_file().
pdf_open_tiff
Открытие рисунка TIFF.
Синтаксис :
void pdf_open_tiff(int pdf_document, string filename)
Используйте функцию pdf_open_image_file().
pdf_open_image_file
Чтение рисунка из файла.
Синтаксис :
void pdf_open_tiff(int pdf_document, string format, string filename)
Эта функция загружает рисунок формата format из файла filename и возвращает его идентификатор.
Возможные форматы:
PNG
TIFF
JPEG
GIF
<?php$pim = pdf_open_image_file($pdf, "png", "pic.png");pdf_place_image($pdf, $pim, 100, 100, 1);pdf_close_image($pdf, $pim);?>
Эта функция заменяет pdf_open_image(), pdf_open_gif(), pdf_open_tiff(), pdf_open_png().
pdf_open_memory_image
Открытие рисунка, созданного графическими функциями PHP.
Синтаксис :
void pdf_open_memory_image(int pdf_document, int image)
Функция принимает дескриптор рисунка, созданного PHP, и делает его доступным для документа pdf. Функция возвращает идентификатор рисунка pdf.
<?php$im = ImageCreate(100, 100);$col = ImageColorAllocate($im, 80, 45, 190);ImageFill($im, 10, 10, $col);$pim = pdf_open_memory_image($pdf, $im);ImageDestroy($im);pdf_place_image($pdf, $pim, 100, 100, 1);pdf_close_image($pdf, $pim);?>
pdf_close_image
Закрытие рисунка.
Синтаксис :
void pdf_close_image(int pdf_document, int image)
Закрывает рисунок, открытый функциями pdf_open_().
pdf_get_image_height
Установка высоты рисунка в пикселах.
Синтаксис :
void pdf_get_image_height(int pdf_document, int image)
pdf_get_image_width
Установка ширины рисунка в пикселах.
Синтаксис :
void pdf_get_image_width(int pdf_document, int image)
pdf_place_image
Размещение рисунка на странице.
Синтаксис :
void pdf_place_image( int pdf_document, int image, double x, double y, souble scale)
Позиция размещения задается (x,y); масштаб - scale.
pdf_put_image
Сохранение рисунка в pdf для дальнейшего использования.
Синтаксис :
void pdf_put_image(int pdf_document, int image)
Функция внедряет рисунок в документ без его отображения. Затем рисунок может быть размещен на странице функцией pdf_execute_image() необходимое число раз. Полезно при многократной вставке рисунка (уменьшает размер файла).
Начиная с версии 2.01 pdflib функция бесполезна и выводит только предупреждение.
pdf_execute_image
Размещение сохраненного рисунка на странице.
Синтаксис :
void pdf_execute_image(int pdf_document, int image, double x, double y, double scale)
Отображает рисунок, внедренный функцией pdf_put_image().
Начиная с версии 2.01 pdflib функция бесполезна и выводит только предупреждение.
<?php$im = ImageCreate(100, 100);$col1 = ImageColorAllocate($im, 80, 45, 190);ImageFill($im, 10, 10, $col1);$pim = pdf_open_memory_image($pdf, $im);pdf_put_image($pdf, $pim);pdf_execute_image($pdf, $pim, 100, 100, 1);// 200%pdf_execute_image($pdf, $pim, 200, 200, 2);pdf_close_image($pdf, $pim);?>
Решение проблемы кодировок
Я не зря выше привел пример отправки письма со словами латинского алфавита. Их любой почтовый клиент прочтет без труда. Но вот с русским алфавитом труднее. Русских кодировок существует огромное множество. И от того, насколько умело Вы перекодируете письмо, будет зависеть прочтет ли получатель его, или не будет возиться с установкой нужной кодировки и просто удалит его в корзину.
Кодировку письма задает заголовок Content-type:
$header="From: "\Evgen"\ <evgen@mail.ru>";$header.="Content-type: text/plain; charset=\"windows-1251\"";$subject="Тема письма";$msg="Сторака 1\nСтрока 2\nСтрока 3";mail("name@mail.ru", $subject, $msg, $header);
В заголовке мы указали, что тип письма будет простой текст, а кодировка - Windows.
Теперь наше письмо придет в понятной для почтового клиента кодировке.
Но стоит отметить, что в некоторых случаях в правильной кодировке будет отображено только само письмо. Заголовок же так и останется нечитаемым. Связано это с тем, где расположен заголовок Content-type относительно заголовка Subject, который и содержит тему письма. Дело в том, что существуют почтовые программы, которые понимают заголовок Content-type, но не понимают русский текст в поле Subject, если это поле стоит до Content-type. В то же время, другие почтовые программы обязывают нас задавать Content-type последним заголовком в списке. Чтобы обойти эти препятствия, можно разместить поле Content-type сразу в начале и в конце списка заголовков:
$subject="Тема письма";$header="Content-type: text/plain; charset=\"windows-1251\"";$header.="From: "\Evgen"\ <evgen@mail.ru>";$header.="Subject: $subject";$header.="Content-type: text/plain; charset=\"windows-1251\"";$msg="Сторака 1\nСтрока 2\nСтрока 3";mail("name@mail.ru", $subject, $msg, $header);
Теперь это письмо прочтет любая почтовая программа!
Сетевые функции
ip2long
Производит конвертацию строки адреса IPv4 в число.
Синтаксис :
int ip2long(string ip_address);
Функция ip2long() возвращает четырехбайтовое численное представление адреса IP v4 из строки (числа, разделенные точками, например: "127.0.0.1").
// получить IP адрес хоста$ip=gethostbyname("www.php.net");echo "Следующие URL эквивалентны:<br>";echo "http://www.php.net/, http://".$ip. "/, и http://".ip2long($ip)."/<br>";
long2ip
Производит конвертацию числа в строку адреса IP v4.
Синтаксис :
string long2ip(int proper_address);
Функция long2ip() возвращает строковое представление IP-адреса (в формате: "aaa.bbb.ccc.ddd") из численного представления.
gethostbyaddr
Возвращает имя хоста, который соответствует заданному IP-адресу.
Синтаксис :
string gethostbyaddr(string ip_address);
Функция gethostbyaddr() возвращает доменное имя хоста, заданного своим IP-адресом. В аргументе указывается адрес IP в строковом формате. В случае ошибки возвращает ip_address.
Надо отметить, что функция не гарантирует, что полученное имя на самом деле будет соответствовать действительности. Она лишь опрашивает хост по адресу ip_address
и просит его сообщить свое имя. Владелец хоста, таким образом, может передавать все, что ему заблагорассудится.
echo gethostbyaddr("127.0.0.1");
gethostbyname
Возвращает IP-адрес хоста.
Синтаксис :
string gethostbyname(string hostname);
Функция gethostbyname() получает в параметрах доменное имя хоста и возвращает его IP-адрес. Если адрес определить не удалось, функция возвращает hostname.
gethostbynamel
Возвращает список IP-адресов хоста.
Синтаксис :
array gethostbynamel(string hostname);
Одному доменному имени может соответствовать сразу несколько IP-адресов, и в случае сильной загруженности серверов DNS-сервер сам выбирает, по какому IP-адресу перенаправить запрос. Он выбирает тот адрес, который использовался наиболее редко.
Функция gethostbynamel() возвращает не один, а все IP-адреса хоста с именем hostname.
Стоит заметить, что в Интернете существует множество виртуальных хостов, которые имеют различные доменные имена, но один и тот же IP-адресс. Таким образом, если следующая последовательность команд для существующего хоста с IP-адресом ip всегда печатает этот же адрес:
$host = gethostbyaddr($ip);echo gethostbyname($host);
то аналогичная последовательность для домена с DNS-именем $host, наоборот, может напечатать не то же имя, а другое:
$ip = gethostbyname($host);echo gethostbyaddr($ip);
getprotobyname
Производит определение номера порта, используемого протоколом.
Синтаксис :
int getprotobyname(string name);
getprotobynumber
Производит определение протокола порта.
Синтаксис :
string getprotobynumber(int number);
getservbyname
Производит определение протокола интернет-службы.
Синтаксис :
int getservbyname(string service, string protocol);
Эта функция возвращает номер порта, который использует служба service.
В аргументе protocol указывается тип протокола - TCP или UDP.
echo getservbyname("HTTP", "TCP"); // может вывести 80
getservbyport
Производит определение интернет-службы, которая использует заданный порт.
Синтаксис :
string getservbyport(int port, string protocol);
Здесь в аргументе protocol нужно указать тип протокола - TCP либо UDP.
echo getservbyport(21, "TCP"); // выведет: ftpecho getservbyport(23, "TCP"); // выведет: telnet
checkdnsrr
Производит проверку записи DNS.
Синтаксис :
int checkdnsrr(string host [, string type]);
Эта функция отправляет запрос DNS-серверу для поиска записей, которые имеются для хоста host. Если были найдены записи типа type, то функция возвращает true. В противном случае и при ошибке - false.
Аргумент typeможет принимать значения:
A
MX (по умолчанию)
NS
SOA
PTR
CNAME
ANY
Аргумент host может указываться строкой в формате IP с разделением точками, либо быть именем хоста.
getmxrr
Производит получение MX записи для интернет-хоста.
Синтаксис :
int getmxrr(string hostname, array mxhosts [, array weight]);
Функция getmxrr() инициирует поиск в базе данных DNS записи MX (почтовый сервер домена) для хоста hostname.
Если запись найдена, возвращает true, если нет - то false.
Список записей MX заносится в массив mxhosts. Если указан массив weight, он заполняется дополнительной информацией о записях.
Часть 4. Управляющие функции
Символические ссылки. Жесткие ссылки
Немного теории
В системах Unix довольно часто возникает необходимость иметь для одного и того же файла или каталога разные имена. При этом одно из имен логично назвать основным, а все другие - его псевдонимами. В терминологии Unix такие всевдонимы называются символическими ссылками.
Символическая ссылка - это просто бинарный файл специального вида, который содержит ссылку на основной файл. При обращении к такому файлу (например, открытию его на чтение) система "соображает", к какому объекту на самом деле запрашивается доступ, и прозрачно его обеспечивает. Это означает, что мы можем использовать символические ссылки точно так же, как и обычные файлы. Однака иногда нужно бывает работать со ссылкой именно как со ссылкой, а не как с файлом. Для этого и существуют перечисленные ниже функции PHP.
Жесткие ссылки
Создание символической ссылки - не единственный способ задать для одного файла несколько имен. Главный недостаток символических ссылок - существование основного имени файла, на которое все и ссылаются. Попробуйте удалить этот файл - и вся "паутина" ссылок, если таковая имелась, развалиться на куски. Есть и другой недостаток: открытие файла, на который указывает ссылка, происходит несколько медленнее, т.к. системе нужно проанализировать содержимое ссылки и установить связь с "настоящим" файлом. Особенно это чувствуется, если одна ссылка указывает на другую, а та на третью и т.д. уровней на 10.
Жесткие ссылки позволяют вам иметь для одного файла несколько совершенно равноправных имен, причем доступ по ним осуществляется одинаково быстро. При этом, если одно из таких имен будет удалено, то сам файл удалиться только в том случае, если данное имя было последним, и других имен у файла нет.
Зарегестрировать новое имя у файла (то есть создать для него жесткую ссылку) можно с помощью функции link(). Ее синтаксис полностью идеентичен функции symlink(), да и работает она по тем же правилам, за исключением того, что создает не символическую, а жесткую ссылку.
readlink
Возвращает имя основного файла.
Синтаксис :
string readlink(string $linkname)
Возвращает имя основного файла, с которым связан его синоним $linkname. Это бывает полезно, если вы хотите узнать основное имя файла, чтобы, например, удалить сам файл, а не ссылку на него. В случае ошибки функция возвращает значение "ложь".
symlink
Создает символическую ссылку.
Синтаксис :
bool symlink(string $target, string $link)
Эта функция создает символическую ссылку с именем $link на объект (файл или каталог), заданную в $target. В случае "провала" функция возвращает false.
lstat
Функция собирает вместе всю информацию, выдаваемую операционной системой для указанной ссылки, и возвращает ее в виде массива.
Синтаксис :
array lstat(string $filename)
Функция полностью аналогична вызову stat(), за исключением того, что если $filename задает не файл, а символическую ссылку, будет возвращена информация именно об этой ссылке (а не о файле, на который она указывает, как это делает stat()).
linkinfo
Функция возвращает значение поля "устройство" из результата, выдаваемого функцией lstat().
Синтаксис :
int linkinfo(string $linkname)
Ее обычно задействуют, если хотят определить, существует ли еще объект, на который указывает символическая ссылка в $linkname.
Скрытие/отображение колонок:
За визуальное отображение колонок отвечает свойство Hidden()
объекта EntireColumn().
Если присвоить этому свойству значение True, то выбранные колонки будут скрыты, если False, то показаны.
Следующий пример скроет колонки с B по D:
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ$range=$xls->Range("B:D"); // Выбираем колонки с B по D $range->EntireColumn->Hidden = True; // Скрыть выбранные колонки?>
Скрытие/отображение строк:
За визуальное отображение строк отвечает свойство Hidden()
объекта EntireRow().
Если присвоить этому свойству значение True, то выбранные строки будут скрыты, если False, то показаны.
Следующий пример скроет строки с 5-ой по 10-ую:
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ$range=$xls->Range("5:10"); // Выбираем строки с 5-ой по 10-ую $range->EntireRow->Hidden = True; // Скрыть выбранные строки?>
Случайные числа
srand
Производит инициализацию генератора случайных чисел.
Синтаксис :
void srand(int seed)
Инициализирует генератор случайных чисел занчением seed.
srand((double) microtime()*1000000);$random = rand();echo $random;
Вот что получиться:
5645
getrandmax
Возвращает максимально возможное случайное число.
Синтаксис :
int getrandmax()
Эта функция возвращает максимальное значение, которое можно получить при помощи функции генерации случайных чисел rand().
Обычно это 32767
rand
Производит генерацию случайного числа.
Синтаксис :
int rand([int max [, int min]])
При вызове с необязательными параметрами min и max эта функция генерирует случайное число, лежащее в пределах этих параметров включительно.
Если параметры min и max отсутствуют, возвращается число, лежащее в пределах от 0 до RAND_MAX.
Для корректной работы данной функции перед ее использованием нужно проинициализировать генератор случайных чисел функцией srand().
mt_rand
Функция возвращает MT-случайное число, достаточно равномерно даже для того, чтобы использовать его в криптографии.
Синтаксис :
int mt_rand(int $min=0, int $max=RAND_MAX)
Если вы хотите генерировать числа не от 0 до RAND_MAX (эта константа задает максимально допустимое случайное число, и ее можно получить при помощи вызова mt_getrandmax()), задайте соответствующий интервал в параметрах $min
и $max. Не забудьте только перед первым вызовом этой функции запустить mt_srand().
mt_srand(time()+(double)microtime()*1000000);$x = mt_rand(1,100); // $x - значение от 1 до 100
mt_srand
Настраивает MT-генератор случайных чисел на новую последовательность.
Синтаксис :
void mt_srand(int seed)
Дело в том, что хотя числа, генерируемые mt_rand(), достаточно равновероятны, но у них есть один нелостаток: последовательность сгенерированных чисел будет одинакова если сценарий вызывать несколько раз подряд. Функция mt_srand()
как раз решает данную проблему: она выбирает новую последовательность на основе параметра $seed, причем практически непредсказуемым образом.
mt_srand(time()+(double)microtime()*1000000);for($i=0;$i<=10;$i++) { $x = mt_rand(1,10);};
В этом случае последовательность устанавливается на основе времени завуска сценария (в секундах), поэтому она достаточно непредсказуема. Для еще более надежного результата рекомендуется приплюсовать сюда еще микросекунды (что и было сделано), а также идентификатор процесса, вызывавшего сценарий.
mt_getrandmax
Возвращает максимальное MT-случайное число.
Синтаксис :
int mt_getrandmax()
Возвращает максимальное число, которое может быть сгенерированно функцией mt_rand() - иными словами, константу RAND_MAX
$max = mt_getrandmax();// $max = 2147483647
lcg_value
функция генерирует случайное дробное число.
Синтаксис :
double lcg_value()
Эта функция возвращает псевдослучайное дробное число в диапазоне от 0 до 1.
Перевод в различные системы счисления
base_convert
Конвертация числа из одной системы счисления в другую.
Синтаксис :
string base_convert(string $number, int $frombase, int $tobase)
Переводит число $number (заданное как строка в системе счисления по основанию $frombase) в систему по основанию $tobase. Параметры $frombase
и $tobase могут принимать значения только от 2 до 36 включительно. В строке $number цифры обозначают сами себя, а буква a
соответствует 11, b -12, и т.д. до z, которая обозначает 36. Например, следующие команды выведут 11111111 (8 единичек), потому что это - не что иное, как представление шестнадцатиричного числа FF в двоичной системе счисления:
$x = base_convert("FF",16,2); //$x = 11111111$x = base_convert("11111111",2,16); //$x = FF$x = base_convert("200",10,16); //$x = C8
bindec
Производит конвертацию двоичного числа в десятичное.
Синтаксис :
int bindec(string binary_string)
Преобразует двоичное число, заданное в строке binary_string, в десятичное число. Максимальное число, которое еще может быть преобразовано, равно 2 147 483 647
$x = bindec(11111111); // $x = 255$x = bindec(10101010); // $x = 170$x = bindec(2147483647); // $x = 1111111111111111111111111111111
decbin
Производит конвертацию десятичного числа в двоичное.
Синтаксис :
string decbin(int $number)
Возвращает строку, представляющую собой двоичное представление целого числа $number. Максимальное число, которое еще может быть преобразовано, равно 2 147 483 647, которое выглядит как 31 единичка в двоичной системе.
Существует аналогичные функции для восьмеричной и шестнадцатиричной систем. Называются они так же, только вместо "bin" подставляются соответственно "oct" и "hex".
$x = decbin(255); // $x = 11111111$x = decbin(2147483647); // $x = 1111111111111111111111111111111
dechex
Производит конвертацию десятичного числа в шестнадцатеричное.
Синтаксис :
string dechex(int number)
Возвращает строку, представляющую собой шестнадцатеричное представление целого числа number. Максимальное число, которое еще может быть преобразовано, равно 2 147 483 647
$x = dechex(2147483647); // $x = 7fffffff
decoct
Производит конвертацию десятичного числа в восьмеричное.
Синтаксис :
string decoct(int number)
Возвращает строку, представляющую собой восьмеричное представление целого числа number. Максимальное число, которое еще может быть преобразовано, равно 2 147 483 647
$x = dechex(2147483647); // $x = 17777777777
hexdec
Производит конвертацию шестнадцатеричного числа в десятичное.
Синтаксис :
int hexdec(string hex_string)
Преобразует шестнадцатеричное число, заданное в строке hex_string, в десятичное число. Максимальное число, которое еще может быть преобразовано, равно 7fffffff
$x = hexdec(7fffffff); // $x = 2147483647
octdec
Производит конвертацию восьмеричного числа в десятичное.
Синтаксис :
int octdec(string octal_string)
Преобразует восьмеричное число, заданное в строке octal_string, в десятичное число. Максимальное число, которое еще может быть преобразовано, равно 17777777777
$x = octdec(17777777777); // $x = 2147483647
deg2rad
Производит конвертацию градусов в радианы.
Синтаксис :
double deg2rad(double number)
Преобразует градусы, заданные в параметре number, в радианы.
rad2deg
Производит конвертацию радианов в градусы.
Синтаксис :
double rad2deg(double number)
Преобразует радианы, заданные в параметре number, в градусы.
number_format
Форматирование числа.
Синтаксис :
number_format($number, $decimals, $dec_point=".", $thousands_sep=",");
Эта функция форматирует число с плавающей точкой с разделением его на триады с указанной точностью. Она может быть вызвана с двумя или четырьмя аргументами, но не с тремя! Параметр $decimals задает, сколько цифр после запятой должно быть у числа в выходной строке. Параметр $dec_point представляет собой разделитель целой и дробной частей, а параметр $thousands_sep - разделитель триад в числе (если указать на его месте пустую строку, то триады не отделяются друг от друга).
Сохранение открытого документа:
Сохранение открытого документа производится при помощи метода SaveAs()
объекта Workbooks():
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add();$range=$xls->Range("A1"); // Выбрали ячейку A1$range->Value = "Проба записи"; // Вставили значение// Сохраняем документ$xls->Workbooks[1]->SaveAs("test.xls"); $xls->Quit(); //Закрываем приложение $xls->Release(); //Высвобождаем объекты$xls = Null; $range = Null;?>
Сортировка массивов
array_reverse
Расстановка элементов массива в обратном порядке.
Синтаксис :
array array_reverse(array arr);
Функция array_reverse() возвращает массив, элементы которого следуют в обратном порядке относительно массива, переданного в параметре. При этом связи между ключами и значениями, конечно, не теряются. Например, вместо того, чтобы ранжировать массив в обратном порядке при помощи arsort(), мы можем отсортировать его в прямом порядке, а затем перевернуть:
$A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor");
asort($A);
$A = array_reverse($A);
shuffle
Перемешивание элементов массива.
Синтаксис:
void shuffle(array arr);
Функция shuffle() "перемешивает" список, переданный ей первым параметром arr, так, чтобы его значения распределялись случайным образом. При этом измениться сам массив и ассоциативные массивы воспринимаются как списки.
$A = array(10,20,30,40,50);shuffle($A);foreach($A as $v) echo "$v ";// Выведет 10,20,30,40,50 в случайном порядке
sort
Сортировка массива по возрастанию.
Синтаксис:
void sort(array arr [, int sort_flags])
Эта функция предназначена для сортировки списков (списки - массивы, ключи которых начинаются с 0 и не имеют пропусков) в порядке возрастания.
$A = array("One", "Two", "Tree", "Four");sort($A);for($i=0; $i<count($A); $i++) echo "$i:$A[$i] ";// выводит "0:Four 1:Two 2:Tree 3:One"
Любой ассоциативный массив Воспринимается этой функцией как список. То есть после упорядочивания последовательность ключей превращается в 0,1,2,..., а значения нужным образом перераспределяются. Как видим, связи между параметрами ключ=>значение не сохраняются, более того - ключи просто пропадают, поэтому сортировать что-либо, отличное от списка, вряд ли целесообразно.
Аргумент sort_flags задает следующие флаги сортировки:
SORT_REGULAR - сравнивает элементы "как есть"
SORT_NUMERIC - сравнивает элементы как числа
SORT_STRING - сравнивает элементы как строки
rsort
Сортировка массива по убыванию.
Синтаксис:
void rsort(array arr [, int sort_flags])
Аналогична функции sort(), только сортирует по убыванию.
asort
Сортировка ассоциативного массива по возрастанию.
Синтаксис :
void asort(array arr [, int sort_flags]);
Функция asort() сортирует массив, указанный в ее параметре, так, чтобы его значения шли в алфавитном (если это строки) или возрастающем (для чисел) порядке. При этом сохраняются связи между ключами и соответствующими им значениями, т.е. некоторые пары ключ=>значение просто "всплывают" наверх, а некоторые - наоборот, "опускаются".
$A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor");asort($A);foreach($A as $k=>$v) echo "$k=>$v ";// выводит "c=>Alpha d=>Processor b=>Weapon a=>Zero"// как видим, поменялся только порядок пар ключ=>значение
По умолчанию функция asort() сортирует массив в алфавитном порядке. Значения флагов сортировки sort_flags приведены в описании функции sort().
arsort
Сортировка ассоциативного массива по убыванию.
Синтаксис :
void arsort(array arr [, int sort_flags]);
Эта функция аналогична функции asort(), только она упорядочивает массив не по возрастанию, а по убыванию.
$arr=array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");arsort($arr);reset($arr);while(list ($key, $val) = each ($arr)) { echo "$key = $val<BR>l";}// выведет:a = oranged = lemonb = bananac = apple
ksort
Сортировка массива по возрастанию ключей.
Синтаксис :
int ksort(array arr [, int sort_flags]);
Функция практически идентична функции asort(), с тем различием, что сортировка осуществляется не по значениям, а по ключам (в порядке возрастания).
$A=array("d"=>"Zero","c"=>"Weapon","b"=>"Alpha","a"=>"Processor");ksort($A);for(Reset($A); list($k,$v)=each($A);) echo "$k=>$v ";// выводит "a=>Processor b=>Alpha c=>Weapon d=>Zero"
Аргумент sort_flags указывавет параметры сортировки.
krsort
Сортировка массива по убыванию индексов.
Синтаксис :
int krsort(array arr [, int sort_flags]);
Эта функция аналогична функции ksort(), только она упорядочивает массив по ключам в обратном порядке.
natsort
Выполняет "естественную" сортировку массива.
Синтаксис :
void natsort(array arr);
Функция natsort() сортирует массив в "естественном" для человека порядке.
$arr1 = array("html_12.html", "html_10.html", "html_2.html", "html_1.html");$arr2 = $arr1;sort($arr1);echo "Стандартная сортировка:\n";print_r($arr1);natsort($arr2);echo "Естественная сортировка:\n"print_r($arr2);
Этот пример выведет следующее:
Стандартная сортировка:Array( [0] => html_1.html [1] => html_10.html [2] => html_12.html [3] => html_2.html)Естественная сортировка:Array( [3] => html_1.html [2] => html_2.html [1] => html_10.html [0] => html_12.html)
uasort
Пользовательская сортировка ассоциативного массива.
Синтаксис:
void uasort(array arr, function cmp_function)
Функция uasort() сортирует массив arr с сохранением индексных ассоциаций, используя для сравнения индексов элементов пользовательскую функцию, указанную аргументом cmp_function.
uksort
Пользовательская сортировка массива по ключам.
Синтаксис:
void uksort(array arr, function cmp_function)
Функция uksort() сортирует массив arr по индексам с сохранением индексных ассоциаций, используя для сравнения индексов элементов пользовательскую функцию, указанную в аргументе cmp_function. В эту функцию передаются два сравниваемых индекса элементов, а она должна вернуть положительное или отрицательное число или 0.
Довольно часто нам приходится сортировать что-то по более сложному критерию, чем просто по алфавиту. Например, пусть в $Files храниться список имен файлов и подкаталогов в текущем каталоге. Возможно, мы захотим вывести этот список не только в лексографическом порядке, но также чтобы все каталоги предшествовали файлам. В этом случае нам стоит воспользоваться функцией uksort(), написав предварительно функцию сравнения с двумя параметрами, как того требует uksort().
// Эта функция должна сравнивать значения $f1 и $f2 и возвращать:// -1, если $f1<$f2,// 0, если $f1==$f2// 1, если $f1>$f2// Под < и > понимаем следование этих имен в выводимом спискеfunction FCmp($f1,$f2){ // Каталог всегда предшествует файлу if(is_dir($f1) && !is_dir($f2)) return -1; // Файл всегда идет после каталога if(!is_dir($f1) && is_dir($f2)) return 1; // Иначе сравниваем лексиграфически if($f1<$f2) return -1; elseif($f1>$f2) return 1; else return 0;}// Пусть $Files содержит массив с ключами - именами файлов// в текущем каталоге. Отсортируем его.uksort($Files,"FCmp"); //передаем функцию сортировки "по ссылке"
usort
Пользоваетльская сортировка массива.
Синтаксис:
void usort(array arr, function cmp_function)
Функция usort() сортирует массив arr с сохранением индексных ассоциаций, используя для сравнения индексов элементов пользовательскую функцию, указанную в аргументе cmp_function. В эту функцию передаются два сравниваемых индекса элементов, а она должна вернуть положительное или отрицательное число или 0.
Эта функция как бы является "гибридом" функций uasort() и sort(). От sort() она отличается тем, что критерий сравнения обеспечивается пользовательской функцией. А от uasort() - тем, что она не сохраняет связей между ключами и значениями, а потому пригодна разве что для сортировки списков.
function FCmp($a,$b) { return strcmp($a,$b); }$A = array("One","Two","Three","Four");usort($A);for($i=0; $i<count($A); $i++) echo "$i:$A[$i] ";// выводит "0:Four 1:One 2:Three 3:Two"
Пример одномерного массива:
function cmp($a, $b) { if($a==$b) return 0; return ($a > $b) ? -1 : 1;}$a=array (3,2,5,6,1);usort($a, "cmp");while(list($key,$val)=each($a)) { echo "$key: $val\n";}
При выполнении будет напечатано:
0: 61: 52: 33: 24: 1
Пример многомерного массива:
function cmp($a,$b) { return strcmp($a["fruit"],$b["fruit"]);};$fruit[0]["fruit"]="lemons";$fruit[1]["fruit"]="apples";$fruit[2]["fruit"]="grapes"; usort($fruit, "cmp"); while(list($key,$val)=each($fruit)) { echo "\$fruit[$key]:".$val["fruit"]."\n";}
При сортировке многомерных массивов $a и $b содержит ссылки на первый индекс массива.
Будет напечатано:
$fruit[0]: apples$fruit[1]: grapes$fruit[2]: lemons
array_multisort
Сортировка релятивных массивов.
Синтаксис:
bool array_multisort(array ar1, [, mixed o1 [, mixed t1 ... [, array ...]]])
Функция array_multisort() сортирует многомерные массивы с сохранением индексной ассоциации, возвращая true при отсутствии ошибок.
Исходные массивы рассматриваются как столбцы таблицы, сортируемой построчно. Поэтому массивы должны иметь одинаковое число элементов, и взаимосвязь между ними, как в строках таблицы, сохраняется. Приоритетом сортировки пользуются первые массивы. Флаги сортировки могут указваться для каждого массива, и их действие распространяется только на тот массив, после которого они указаны.
Флаги определения порядка сортировки (аргументы ox):
SORT_ASC - сортировка в порядке возрастания (по умолчанию)
SORT_DESC - сортировка в порядке убывания Флаги типа сортировки (аргументы tx):
SORT_REGULAR - сравнивать элементы как есть (по умолчанию)
SORT_NUMERIC - сравнивать элементы как числа
SORT_STRING - сравнивать элементы как строки
ar1 = array("10", 100, 100, "a");ar2 = array(1, 3, "2", 1);array_multisort($ar1, $ar2); // $ar1 = array("10", "a", 100, 100); // $ar2 = array(1, 1, "2", 4);
Элементы второго массива, соответствующие одинаковым элементам (100 и 100) первого массива, также отсортированны.
$ar = array(array("10", 100, 100, "a"), array(1, 3, "2", 1));array_multisort($ar[0], SORT_ASC, SORT_STRING, $ar[1], $SORT_NUMERIC, SORT_DESC);
$ar[0] = ("10", 100, 100, "a") - сортируются как строки по возрастанию $ar[1] = (1, 3, "2", 1) - сортируются как числа по убыванию.
Составление/разбиение строк
substr
Возвращает участок строки с определенной длиной.
Синтаксис :
string substr(string str, int start [,int length])
Возвращает участок строки str, начиная с позиции start и длиной length. Если length не задана, то подразумевается подстрока от start до конца строки str. Если start больше, чем длина строки, или же значение length равно нулю, то возвращается пустая подстрока.
Однако эта функция может делать и еще довольно полезные вещи. К примеру, если мы передадим в start отрицательное число, то будет считаться, что это число является индексом подстроки, но только отсчитываемым от конца str
(например, -1 означает "начинается с последнего символа строки").
Параметр length, если он задан, тоже может быть отрицательным. В этом случае последним символом возвращаемой подстроки будет символ из str с индексом length, определяемым от конца строки.
$str = substr("abcdef", 1); // возвратит "bcdef"$str = substr("abcdef", 1, 3); // возвратит "bcd"$str = substr("abcdef", -1); // возвратит "f"$str = substr("abcdef", -2); // возвратит "ef"$str = substr("abcdef", -3, 1); // возвратит "d"$str = substr("abcdef", 1, -1); // возвратит "bcde"
str_repeat
Повторяет строку определенное количество раз.
Синтаксис :
string str_repeat(string str, int number)
Функция "повторяет" строку str number раз и возвращает объединенный результат.
echo str_repeat("test!",3); // выводит test!test!test!
str_pad
Дополняет строку другой строкой до определенной длины.
Синтаксис :
string str_pad(string input, int pad_length [, string pad_string [, int pad_type]])
Аргумент input задает исходную строку. Аргумент pad_length задает длину возвращаемой строки. Если он имеет значение меньше, чем исходная строка, то никакого добавления не производится.
При помощи необязательного аргумента pad_string можно указать, какую строку использовать в качестве заполнителя (по умолчанию - пробелы).
При помощи необязательного аргумента pad_type можно указать, с какой стороны следует дополнять строку: справо, слево или с обеих сторон.
Этот аргумент может принимать следующие значения:
STR_PAD_RIGHT (по умолчанию)
STR_PAD_LEFT
STR_PAD_BOTH
$str = "Aaaaa";echo str_pad($str, 10);// возвратит "Aaaaa"echo str_pad($str, 10, "-=", STR_PAD_LEFT);// возвратит "-=-=-Aaaaa"echo str_pad($str, 10, "_", STR_PAD_BOTH)// возвратит "_Aaaa_"
chunk_split
Возвращает фрагмент строки.
Синтаксис :
string chunk_split(string str [, int chunklen [, string end]])
Функция chunk_split() возвращает строку, в которой между каждым блоком строки str длиной chunklen (по умолчанию 76) вставляется последовательность разделителей end (по умолчанию: "\r\n").
Данная функция может быть полезна при конвертировании в формат "base64" для соответствия правилам RFC 2045.
// отформатируем $data, используя семантику RFC 2045$str = chunk_split(base64_encode($data));
Эта функция работает значительно быстрее, чем ereg_replace().
strtok
Возвращает строку по частям.
Синтаксис :
string strtok(string arg1, string arg2)
Фунция возвращает часть строки arg1 до разделителя arg2. При последующих вызовах возвращается следующая часть до следующего разделителя, и так до конца строки. При первом вызове функция принимате два аргумента: исходную строку arg1 и разделитель arg2. При каждом последующем вызове аргумент arg1 указываеть не надо, иначе будет возвращаться первая часть строки. Когда возвращать больше нечего, функция вернет false. Если часть строки состоит из 0 или из пустой строки, то функция также вернет false.
$str="This is an example№string№ Aaa";$tok = strtok($str, " ");while($tok) { echo "$tok"; $tok = strtok(" №");};// выведет: "This" "is" "an" "example" "string"
Надо заметить, что в качестве разделителей указывается последовательность символов, каждый из которых в отдельности может являться разделителем, но когда в строке последовательно встречаются два или более разделителей, функция возвращает пустую строку (что может прекратить цикл обработки, как в примере).
explode
Производит разделение строки в массив.
Синтаксис :
array explode(string seperator, string str [, int limit])
Функция explode() возвращает массив строк, каждая из которых соответствует фрагменту исходной строки str, находящемуся между разделителями, указанными аргументом separator.
Необязательный параметр limit указывает максимальное количество элементов в массиве. Оставшаяся неразделенная часть будет содержаться в последнем элементе.
$str = "Path1 Path2 Path3 Path4";$str_exp = explode(" ", $str);// теперь $str_exp = array([0] => Path1, [1] => Path2,// [2] => Path3, [3] => '', [4] => Path4)
implode
Производит объединение массива в строку.
Синтаксис :
string implode(string glue, array pieces)
Функция implode() возвращает строку, которая содержит последовательно все элементы массива, заданного в параметре pieces, между которыми вставляется значение, указанное в параметре glue.
$str = implode(":", $arr);
join
Производит объединение массива в строку.
Синтаксис :
string join(string glue, array pieces)
То же, что и implode().
Создание голосования на PHP
Для начала надо определиться, о чем мы будем спрашивать посетителей. Например, понравился им ваш сайт или нет.
для нашего голосования нам потребуются четыре файла:
В первом будет находиться форма с голосованием (form.html).
Второй файл будет отвечать за обработку результатов (golos.php).
В третьем будут храниться данные голосования (data.txt).
Четвертый будет отвечать за выдачу графической информации (img.php).
Например мы хотим задать посетителям следующие вопросы:
Ваше мнение о сайте: просто супер, нормальный, так себе, мне все равно, плохой, хуже не видел.
В файл form.html запишем:
<form action=golos.php method=post><table cellspacing cellpadding=0 border=0><tr><td align=center colspan=2><B>Голосование:</B></td></tr><tr><td align=center colspan=2><B>Ваше мнение о сайте:</B></td></tr><tr><td><input type=radio name=otv value=1 checked></td><td>Просто супер!</td></tr><tr><td><input type=radio name=otv value=2></td><td>Нормальный.</td></tr><tr><td><input type=radio name=otv value=3></td><td>Так себе.</td></tr><tr><td><input type=radio name=otv value=4></td><td>Мне все равно.</td></tr><tr><td><input type=radio name=otv value=5></td><td>Плохой.</td></tr><tr><td><input type=radio name=otv value=6></td><td>Хуже не видел!</td></tr><tr><td colspan=2 align=center><input type=submit name=golos value="Голосовать"></td></tr></table</form>
После нажатия кнопки Голосовать переменная otv
перейдет на обработку сценарием в файле golos.php
В файл data.txt надо записать начальные данные, которые затем будут оттуда считаны и обработаны.
Создайте в файл data.txt и в текстовом редакторе запишите в него следующие строки:
Результаты голосования:000000
Первая строка у нас учитываться не будет.
В остальные шесть строк надо ввести нули, нажимая после каждой цифры клавишу Enter.
В файле golos.php, который у нас отвечает за обработку результатов, напишем следующее:
<html><head><title>Обработка голосования</title></head><body><?if(@$golos) {// Здесь мы запускаем обработку данных только если // была нажата клавиша Голосовать $file_name="data.txt"; // Переменная $file_name задает имя файла с результатами $file=file($file_name); // Записываем файл с данными в массив $file $file_len=count($file); // $file_len - количество строк в файле data.txt for($i=1,$n=0;$i<$file_len;$i++) { $file[$i]=trim($file[$i]); $n=$n+$file[$i]; }; // В этом цикле мы убираем символы перевода строки и записываем в // переменную $n сколько человек уже проголосовало echo "<center><h2>Спасибо, Ваше мнение учтено!</h2></center>"; $file[$otv]++; $n++; // Здесь мы учитываем номер ответа, который пришел к нам из формы, // увеличив соответствующее значение в массиве и число проголосовавших на 1 $rez="Результаты голосования:\n"; // Переменная $rez будет содержать данные о голосовании, // которые затем запишем обратно в файл for($i=1;$i<$file_len;$i++) $rez.=$file[$i]."\n"; $rez=trim($rez); $file_rec=@fopen($file_name,"w"); // Здесь мы создаем новый файл, в который затем запишем обновленные данные if($file_rec) { $counter=fputs($file_rec,$rez); // Запись обновленных данных в файл data.txt fclose($file_rec); } else echo "Произошла ошибка записи результатов!"; for($i=1;$i<$file_len;$i++) $pr[$i]=round(($file[$i]/$n)*100);// Записали в массив $pr, сколько процентов от общего числа голосовавших// занимает каждый ответ// Далее идет кусок HTML-кода, который// отвечает за вывод наших данных на экран?><center><h2>Ваше мнение о сайте:</h2></center><BR><table border=1 align=center><tr><td><B>Просто супер! (<?echo $file[1];?>):</B></td><td><img src="img.php?pr=<?echo $pr[1];?>" height=15></td></tr><tr><td><B>Нормальный. (<?echo $file[2];?>):</B></td><td><img src="img.php?pr=<?echo $pr[2];?>" height=15></td></tr><tr><td><B>Так себе. (<?echo $file[3];?>):</B></td><td><img src="img.php?pr=<?echo $pr[3];?>" height=15></td></tr><tr><td><B>Мне все равно. (<?echo $file[4];?>):</B></td><td><img src="img.php?pr=<?echo $pr[4];?>" height=15></td></tr><tr><td><B>Плохой. (<?echo $file[5];?>):</B></td><td><img src="img.php?pr=<?echo $pr[5];?>" height=15></td></tr><tr><td><B>Хуже не видел! (<?echo $file[6];?>):</B></td><td><img src="img.php?pr=<?echo $pr[6];?>" height=15></td></tr></table><table border=1 align=center><tr><td align=center><B>Всего проголосовало:</B></td></tr><tr><td align=center><?echo $n." человек";?></td></tr></table><?};?></body></html>
Записав в атрибут SRC тега <IMG> значение "img.php?pr= количество процентов" мы тем самым передаем файлу img.php (который отвечает за вывод графической информации) значение, на основании которого будет на лету сгенерировано изображение голосования. Далее приведу листинг файла img.php:
<? $otstup=35; // $otstup - задает отступ, в прелелах которого // в картинку впишем процентное значение $string=$pr."%"; // $string - содержит значение процентов плюс знак процента $im=imageCreate($pr*2+$otstup,15); // Здесь создаем идентификатор, при помощи // которого мы будем работать с картинкой $fon=imageColorAllocate($im,220,20,60); $fon1=imageColorAllocate($im,255,20,147); // Задаем цвет фона $col_b=imageColorAllocate($im,0,0,0); // Задаем цвет обводки $shrift=imageColorAllocate($im,255,255,255); // Цвет вывода процентного значения imageFill($im,2,2,$fon); // Заполнили наш прямоугольник основным фоном $x1=0;$x2=$pr*2+$otstup-1; $y1=0;$y2=14; // Формирование улов для обводки контуром imageLine($im,$x1,$y1,$x2,$y1,$col_b); imageLine($im,$x2,$y1,$x2,$y2,$col_b); imageLine($im,$x2,$y2,$x1,$y2,$col_b); imageLine($im,$x1,$y1,$x1,$y2,$col_b); imageLine($im,$x1+$otstup,$y1,$x1+$otstup,$y2,$col_b); // Создание контура и разделяющей полосы if($pr!=0) imageFill($im,$otstup+1,2,$fon1); // Если значение процента не равно 0, то заполняем // правую часть цветом $fon1 imageString($im,3,5,1,$string,$shrift); // Пишем в правую часть картинки процентное значение header("Content-type: image/png"); imagePng($im); imageDestroy($im); // Здесь производим вывод полученной картинки в // стандартный поток вывода и уничтожаем идентификатор?>
В итоге получиться что-то типа:
Создание массива
array
Создание и инициализация массива.
Синтаксис :
array array([mixed ...])
Функция возвращает созданный массив. Индексы и значения в массиве разделяются оператором =>. Пары index=>value разделяются запятыми, они определяют индекс и значение.
Индекс может быть как числовым, так и строковым. В ассоциированных массивах индекс всегда ведет себя как строковой. В случае, если индекс не указан, будет подставляться автоинкремент (на 1 больше), начиная с 0. Если при создании массива были указаны два элемента с одинаковыми индексами, то последний элемент заменяет первый.
$arr=array( // Далее мы создадим двумерный массив"fruit" => array("a"=>"orange", "b"=>"banan", "c"=>"apple"),// эта запись эквивалентна записи: $arr["fruit"]["a"]="orange"; и т.д."number" => array(1,2,3,4,5,6),// эта запись эквивалентна записи: $arr["number"][]=1; и т.д."hotel" => array("first", 5=>"second", "third"));$arr=array(1, 1, 1, 1, 2=>5, 19, 3=>20);print_r($arr);// Далее распечатка этого массиваArray( [0] => 1 [1] => 1 [2] => 5 [3] => 20 [4] => 19)$arr=array(1 => "Январь", "Февраль", "Март");print_r($arr);// распечаткаArray( [1] => Январь [2] => Февраль [3] => Март)
range
Заполняет список целыми числами.
Синтаксис :
list range(int low, int high)
Функция range() создает список, заполненный целыми числами от low до high
включительно. Ее удобно применять, если мы хотим быстро сгенерировать массив для последующего прохождения по нему циклом forech.
$arr=range(4,9);// теперь $arr = array(4, 5, 6, 7, 8, 9);
Создание нового документа:
Создание нового документа в Excel происходит в три действия:
1. - Создаем "связь" между PHP и Excel (создается дескриптор, как при работе с файлами);
2. - Указываем, будет ли визуально открыта программа или нет;
3. - Указываем программе через дескриптор, что нужно открыть новый документ.
Для создания дескриптора ("связи") нужно использовать обращение к Excel через COM-объект:
$xls = new COM("Excel.Application");
Теперь через дескриптор $xls мы можем обращаться ко всем свойствам и методам Excel.
Будет ли отображаться Excel или нет, указывается в свойстве Visible()
объекта Application().
Если мы этому свойству присвоим значение 1, то программа будет отображаться, если 0, то нет:
$xls->Application->Visible = 1;
Ну и, наконец, добавить новый документ можно при помощи метода Add()
объекта Workbooks():
$xls->Workbooks->Add();
Т.е. чтобы просто запустить при помощи PHP Excel нужно выполнить следующий код:
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ?>
Первые две строки этого примера нужно использовать всегда при работе с Excel через PHP.
SSI и функция virtual()
Немного теории
Для одного и того же документа в Apache нельзя применять два "обработчика". Иными словами, действует принцып: либо PHP, либо SSI. Однако в PHP имеются определенные средства для "эмуляцииquot; SSI-конструкции include virtual.
Конструкция include virtual загружает файл, URL которого указан у нее в параметрах, обрабатывает его нужным обработчиком и выводит в браузер. То ести все происходит так, будто указанный URL был затребован виртуальным браузером. Большинство SSI-файлов ограничиваются использованием этой возможности.
virtual
Имитация include virtual.
Синтаксис :
int virtual(string $url)
Функция virtual() представляет собой процедуру, которая может поддерживаться только в случае, если PHP установлен как модуль Apache. Она делает то же самое, что и SSI-инструкция <-- #include virtual=... -->. Иными словами, она генерирует новый запрос серверу, обрабатываемый им обычным образом, а затем выводит данные в стандартный поток вывода.
Чаше всего функция virtual() используется для запуска внешних CGI-сценариев, написанных на другом языке программирования, или же для обработки SSI-файлов более сложной структуры. В случае, если запускается сценарий, он должен генерировать правильные HTTP-заголовки, иначе будет выведено сообщение об ошибке. Для включения обычных PHP-файлов с участками кода функция virtual() неприменима - это выполняет оператор include.
Статус подключений
Внутренне PHP имеет три статуса подключения:
0 - NORMAL;
1 - ABORTED (прервано пользователем);
2 - TIMEOUT (истеклож время ожидания ответа).
При норамальном выполнении сценария активно состояние NORMAL. Если во время загрузки страницы пользователь нажал кнопку STOP, активным становится состояние ABORTED. Если сценарий выполняется дольше отведенного ему времени, устанавливается флаг состояния TIMEOUT. Возможно определить, как должен вести себя сценарий в зависимости от этих условий.
Если требуется, чтобы сценарий продолжал свое выполнение при разрыве соединения пользователем, нужно установить в файле конфигурации значение параметра ignore_user_abort = 1 (это также можно сделать в файлах конфигурации Apache). Можно также воспользоваться функцией ignore_user_abort(). В противном случае, сценарий завершается.
Чтобы игнорировать завершение сценария таймером, необходимо использовать функцию set_time_limit().
Если функцией register_shutdown_function() была установлена функция "запускаемая при завершении сценария", то, вне зависимости от статуса подключения, она будет исполнена перед тем, как сценарий завершится. И в "завершающей" функции можно будет выяснить (с помощью функции: connection_aborted(), connection_timeout() и connection_status()), был ли сценарий завершен нормально или досрочно.
connection_aborted
Определения разрыва подключения пользователем.
Синтаксис :
int connection_aborted(void);
Функция connection_aborted() возвращает true, если подключение было разорвано пользователем.
connection_status
Определения статуса подключения.
Синтаксис :
int connection_status(void);
Возвращает значение битового поля, позволяющее выяснить в "завершающей" функции, был ли сценарий завершен досрочно и причину этого. Например, если возвращается 3 (ABORTED | TIMEOUT), то это означает, что время выполнения истекло, а также то, что пользователь отказался от загрузки страницы.
Если возвращается 0 (то есть значение NORMAL), то это означает, что выполнение сценария не было прервано.
connection_timeout
Определения наступления тайм-аута.
Синтаксис :
int connection_timeout(void);
Возвращает true, если время выполнения сценария истекло.
ignore_user_abort
Прерывание сценария при разрыве подключения.
Синтаксис :
int ignore_user_abort([int setting]);
Аргументом setting можно указать, необходимо ли досрочно завершать выполнение сценария, если связь с клиентом потеряна. Если аргумент не указан, то возвращается текущая установка.
register_shutdown_function
Устанавливает функцию, которая будет выполнена при завершении.
Синтаксис :
int register_shutdown_function(string func);
Регистрирует функцию с именем func в качестве функции, запускаемой после завершения сценария.
Заметьте: так как после завершения функции никакие средства вывода недоступны, это делает для функции, зарегистрированной в качестве "завершающей", недоступными обычные средства отладки, такие команды как print или echo.
Степенные функции
sqrt
Возвращает квадратный корень из аргумента.
Синтаксис :
float sqrt(float $arg)
Если аргумент отрицателен, то генерируется предупреждение, но работа программы не прекращается!
$x = sqrt(9); // $x = 3echo sqrt(25); // выведет 5echo sqrt(-25); // выведет -1.#IND
log
Возвращает натуральный логарифм аргумента.
Синтаксис :
float log(float $arg)
В случае недопустимого числа печатает предупреждение, но не завершает программу.
$x = log(exp(2)); // exp(2) - e в степени 2 // $x = 2$x = log(M_E); // $x = 1echo log(10); // выведет 2.302585092994
log10
Возвращает десятичный логарифм аргумента.
Синтаксис :
float log10(float $arg)
В случае недопустимого числа печатает предупреждение, но не завершает программу.
echo log10(100); // выведет 2
exp
Возвращает e (2,718281828) в степени $arg.
Синтаксис :
float exp(float $arg)
$x = exp(1); // $x = 2.718281828459
pow
Возведение в степень.
Синтаксис :
float pow(float $base, float $exp)
Возвращает $base в степени $exp.
$x = pow(3,2); // $x = 9$x = pow("3",2); // $x = 9
Стиль документа
pdf_set_border_style
Установка стиля обрамления примечаний и гиперссылок.
Синтаксис :
void pdf_set_border_style(int pdf_document, string style, double width)
Аргумент style может принимать значения "solid" или "dashed". Ширина задается аргументом width.
pdf_set_border_color
Установка цвета обрамления примечаний и гиперссылок.
Синтаксис :
void pdf_set_border_color(int pdf_document, double red, double green, double blue)
Три компонента цвета могут принимать значения из диапазона от 0.0 до 1.0
pdf_set_border_dash
Установка стиля окантовки ссылок и примечаний.
Синтаксис :
void pdf_set_border_dash(int pdf_document, double black, double white)
Устанавливает длину черных и белых полос прерывистых линий.
pdf_add_annotation
Добавление примечания.
Синтаксис :
void pdf_add_annotation(int pdf_document, double llx, double lly, double urx, double ury, string title, string content)
Примечание предполагается в нижнем левом углу (llx, lly), верхний правый угол (urx, ury).
Строковые суммы и хеш-функции
strlen
Возвращает длину строки.
Синтаксис :
int strlen(string str)
Возвращает просто длину строки, т.е., сколько символов содержится в str.
Строка может содержать любые символы, в том числе и с нулевым кодом. Функция strlen()
будет правильно работать и с такими строками.
count_chars
Возвращает информацию о символах строки.
Синтаксис :
mixed count_chars(string str [, int mode])
Функция count_chars() подсчитывает частоту встречаемости каждого байта (0-255) в строке str и возвращает в массиве результат согласно необязательному аргументу mode. mode может принимать следующие значения:
0 (по умолчанию)- массив с байтами в качестве индексов и частотой повторения в качестве значений элемента массива
1 - похож на 0, но отсутствующие в строке str байты не возвращаются
2 - похож на 0, но возвращаются только те байты, которые отсутствуют
3 - возвращается строка, состоящая из всех обнаруженных символов
4 - возвращается строка, состоящая из всех отсутствующих символов
md5
Получение строки-хеша MD5.
Синтаксис :
string md5(string str);
Возвращает хеш-код строки str, основанный на алгоритме корпорации RSA Data Security под названием "MD5 Message-Digest Algorithm". Хеш-код - это просто строка, практически уникальная для каждой из строк str. То есть вероятность того, что две разные строки, переданные в str, дадут нам одинаковый хеш-код, стремиться к нулю.
В то же время, если длина строки str может достигать нескольких тысяч символов, то ее MD5-код занимает максимум 32 символа.
crc32
Получение полиминала строки crc32.
Синтаксис :
int crc32(string str);
Функция crc32() вычисляет 32-битную контрольную сумму строки str. То есть, результат ее работы - 32-битное (4-байтовое) целое число.
Обычно эту функцию используют для проверки целостности переданных данных.
Эта функция работает гораздо быстрее md5(), но в то же время выдает гораздо менее надежные "хеш-коды" для строки. Так что, теперь, чтобы получить методом случайного подбора для двух разных строк одинаковые "хеш-коды", вам потребуется не триллион лет работы самого мощного компьютера, а всег лишь год-другой.
crypt
Производит симметричное шифрование.
Синтаксис :
string crypt(string str [,string salt]);
В аргументе str задается строка, которую надо зашифровать.
Хеш-код для одной и той же строки, но с различными значениями salt
(Кстати, это должна быть обязательно двухсимвольная строка) дает разные результаты. Если параметр salt пропущен, PHP сгенерирует его случайным образом.
В системах, которые поддерживают несколько алгоритмов шифрования, следующие константы устанавливаются равными 1 или 0, в зависимости от того, поддерживается ли данный алгоритм или нет:
CRYPT_STD_DES - стандартное 2-байтовое DES-шифрование (SALT=2)
CRYPT_EXT_DES - расширенное 9-байтовое DES-шифрование (SALT=9)
CRYPT_MD5 - 12-байтовое MD5-шифрование (SALT начинается с $1$)
CRYPT_BLOWFISH - расширенное 12-байтовое DES-шифрование (SALT начинается с $2$)
Т.к. данная функция использует односторонний алгоритм шифрования, то функции дешифрования не имеется.
metaphone
Производит вычисление метафон-хеша.
Синтаксис :
string metaphone(string str);
Данная функция схожа по действию с soundex(), вычисляет код произношения слова, переданного в строке str, но с повышенной точностью вычисления, т.к. использует правила произношения английского языка.
Возвращаемое строковое значение может быть переменной длины.
soundex
Вычисления хеша сходности произношения.
Синтаксис :
string soundex(string str);
Функция soundex() используется для проверки правописания, когда приблизительно известно как звучит слово, но не известно, как оно пишется, и имеется словарь (база данных), относительно которого можно осуществить проверку.
Возвращается строка из 4 символов: первая буква слова и 3 цифры.
soundex("Euler") == soundex("Ellery") == "E460";soundex("Gauss") == soundex("Ghosh") == "G200";soundex("Hilbert") == soundex("Heilbronn") == "H416";soundex("Knuth") == soundex("Kant") == "K530";soundex("Lloyd") == soundex("Ladd") == "L300";soundex("Lukasiewicz") == soundex("Lissajous") == "L222";
Тригонометрия
sin
Возвращает синус аргумента.
Синтаксис :
float sin(float $arg)
Аргумент задается в радианах.
$x = sin(M_PI_2); // $x = 1
cos
Возвращает косинус аргумента.
Синтаксис :
float cos(float $arg)
$x = cos(0); // $x = 0$x = cos(M_PI); // $x = -1
tan
Возвращает тангенс аргумента, заданного в радианах.
Синтаксис :
float tan(float $arg)
$x = tan(M_PI_4); // $x = 1
acos
Возвращает арккосинус аргумента.
Синтаксис :
float acos(float $arg)
$x = acos(0); // $x = pi/2$x = acos(1); // $x = 0
asin
Возвращает арксинус.
Синтаксис :
float asin(float $arg)
$x = asin(0); // $x = 0$x = asin(1); // $x = pi/2
atan
Возвращает арктангенс аргумента.
Синтаксис :
float atan(float $arg)
$x = atan(0); // $x = 0$x = atan(1); // $x = pi/4
atan2
Получение арктангенса двух чисел.
Синтаксис :
float atan2(float $y, float $x)
Возвращает арктангенс величины $y/$x, но с учетом той четверти, в которой лежит точка ($x,$y). Эта функция возвращает результат в радианах, принадлежащий отрезку от -? до ?.
$x = atan2(1,1); // $x = pi/4$x = atan2(-1,-1); // $x = -3*pi/4
pi
Возвращает число пи - 3,14.
Синтаксис :
double pi()
Эту функцию обязательно нужно вызывать с парой пустых скобок:
$x = pi()*2 // $x = 31.415926535898
Функции повышенной точности BCMath
bcadd
Сложение двух чисел произвольной точности.
Синтаксис :
string bcadd(string left_operand, string right_operand [, int scale]);
Эта функция возвращает строковое представление суммы двух параметров (left_operand + right_operand) с точностью, которая указана в необязательном параметре scale.
Точность (scale) указывает количество десятичных знаков после запятой).
bccomp
Сравнение двух чисел произвольной точности.
Синтаксис :
int bccomp(string left_operand, string right_operand, [int scale]);
Сравнивает числа (left_operand с right_operand) и возвращает результат типа integer (целое). Параметр scale используется для установки количества цифр после десятичной отметки, используемых при сравнении. При равенстве двух частей возвращается значение 0. Если левая часть больше правой части возврашается +1, и если левая часть меньше правой части возвращается -1.
bcdiv
Операция деления для двух чисел произвольной точности.
Синтаксис :
string bcdiv(string left_operand, string right_operand [, intscale]);
Делит left_operand на right_operand и возвращает результат с точностью (знаками после запятой), заданной в параметре scale.
bcmod
Возвращает остаток целочисленного деления.
Синтаксис :
string bcmod(left_operand, string modulus);
Данная функция возвращает остаток от целочисленного деления left_operand на modulus.
bcmul
Операция умножения для двух чисел произвольной точности.
Синтаксис :
string bcmul(string left_operand, string right_operand [, int scale]);
Производит умножение left_operand на right_operand, и выдает результат в виде строки с точностью, заданной в переменной scale.
bcpow
Возведение одного числа произвольной точности в степень другого.
Синтаксис :
string bcpow(string x, string y, [int scale]);
Возведение x в степень y. Параметр scale может использоваться для установки количества цифр после точки.
bcscale
Устанавливает точность вычислений.
Синтаксис :
string bcscale(int scale);
Эта функция устанавливает заданную по умолчанию точность вычислений для всех математических функций BCMath, которые явно не определяют точность.
bcsqrt
Получение квадратного корня числа произвольной точности.
Синтаксис :
string bcsqrt(string operand [,int scale]);
Возвращает кваддратный корень аргумента operand. Параметр scale устанавливает количество цифр после десятичной отметки в результате.
bcsub
Вычитает одно число произвольной точности из другого.
Синтаксис :
string bcsub(string left_operand, right_operand [, int scale]);
Возвращает разность двух переменных, указанных в параметрах функции (left_operand - right_operand) с точностью, указанной в необязательном параметре scale.
Удаление колонки:
Удаление колонки производится при помощи метода Delete()
объекта EntireColumn():
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ // Вставляем в 1-ую, 2-ую и 3-ю верхние ячейки значения$range=$xls->Range("A1"); // Выбрали ячейку A1$range->Value = "1-ая колонка"; // Вставили значение$range=$xls->Range("B1"); // Выбрали ячейку B1$range->Value = "2-ая колонка"; // Вставили значение$range=$xls->Range("C1"); // Выбрали ячейку C1$range->Value = "3-ая колонка"; // Вставили значение // Удаляем колонку$range=$xls->Range("B:B"); // Определяем коноку$range->EntireColumn->Delete(); // Удаляем ее?>
Удаление строки:
Удаление строки производится при помощи метода Delete()
объекта EntireRow():
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ // Вставляем в 1-ую, 2-ую и 3-ю верхние ячейки значения$range=$xls->Range("A1"); // Выбрали ячейку A1$range->Value = "1-ая строка"; // Вставили значение$range=$xls->Range("A2"); // Выбрали ячейку A2$range->Value = "2-ая строка"; // Вставили значение$range=$xls->Range("A3"); // Выбрали ячейку A3$range->Value = "3-ая строка"; // Вставили значение // Удаляем строку$range=$xls->Range("2:2"); // Определяем строку$range->EntireRow->Delete(); // Удаляем ее?>
Установка локали (локальных настроек)
setlocale
Установка региональных настроек.
Синтаксис :
string SetLocale(string category, string locale);
Функция setlocale устанавливает текущую локаль, с которой будут работать функции преобразования регистра символов, вывода даты-времени и т.д. Вообще говоря, для каждой категории функций локаль определяется отдельно и выглядит по-разному. То, какую именно категорию функций затронет вызов setlocale(), задается в параметре category. Он может принимать следующие строкрвые значения:
LC_CTYPE
- активизирует указанную локаль для функций перевода в верхний/нижний регистры;
LC_NUMERIC
- активизирует локаль для функций форматирования дробных чисел - а именно, задает разделитель целой и дробной части в числах;
LC_TIME
- задает формат вывода даты и времени по умолчанию;
LC_ALL
- устанавливает все вышеперечисленные режимы.
Теперь поговорим о параметре locale. Как известно, каждая локаль, установленная в системе, имеет свое уникальное имя, по которому к ней можно обратиться. Именно оно и фиксируется в этом параметре. Однако, есть два важных исключения из этого правила. Во-первых, если величина locale равна пустой строке "", то устанавливается та локаль, которая указана в глобальной переменной окружения с именем, совпадающем с именем категории category
(или LANG - она практически всегда присутствует в Unix). Во-вторых, если в этом параметре передается 0, то новая локаль не устанавливается, а просто возвращается имя текущей локали для указанного режима.
setlocale("LC_CTYPE","ru_SU.KOI*-R");// Здесь вызов устанавливает таблицу замены// регистра букв в соответствии с кодировкой KOI8-R.
Установка масштаба и системы координат
pdf_translate
Установка начала системы координат.
Синтаксис :
void pdf_translate(int pdf_document, double x, double y)
Координаты указываются относительно текущей точки отсчета. Затем, до начала рисования объектов, требуется установить текущую точку.
<?phppdf_moveto($pdf, 0, 0);pdf_lineto($pdf, 100, 100);pdf_stroke($pdf);psd_translate($pdf, 100, 100);pdf_moveto($pdf, 0, 0);pdf_lineto($pdf, 100, 100);pdf_stroke($pdf);?>
pdf_scale
Установка масштабирования.
Синтаксис :
void pdf_scale(int pdf_document, double x_scale, double y_scale)
<?phppdf_scale($pdf, 72.0, 72.0);pdf_lineto($pdf, 1, 1); // на дюймpdf_stroke($pdf);?>
pdf_rotate
Установка угла вращения в градусах.
Синтаксис :
void pdf_rotate(int pdf_document, double angle)
pdf_setflat
Установка равномерности.
Синтаксис :
void pdf_setflat(int pdf_document, double value)
Возможные значения параметра - от 0 до 100.
pdf_setlinejoin
Установка параметра linejoin.
Синтаксис :
void pdf_setlinejoin(int pdf_document, double value)
Возможные значения параметра - от 0 до 2.
pdf_setlinecap
Установка параметра linecap.
Синтаксис :
void pdf_setlinecap(int pdf_document, double value)
Возможные значения параметра - от 0 до 2.
pdf_setmiterlimit
Установка параметра miter limit.
Синтаксис :
void pdf_miterlimit(int pdf_document, double value)
Возможные значения параметра - 1 и более.
pdf_setlinewidth
Установка ширины строк.
Синтаксис :
void pdf_setlinewidth(int pdf_document, double width)
pdf_setdash
Установка текущей точки.
Синтаксис :
void pdf_setdash(int pdf_document, double white, double black)
pdf_moveto
Установка текущей точки.
Синтаксис :
void pdf_moveto(int pdf_document, double x, double y)
Установка пользовательского обработчика ошибок
set_error_handler
Установка пользовательского обработчика ошибок.
Синтаксис :
string set_error_handler(string error_handler)
Функция возвращает имя функции, ранее определенной в качестве обработчика ошибок (или FALSE при ошибке), и устанавливает, в качестве нового обработчика, функцию с указанным в аргументе error_handler именем.
Обычно пользовательский обработчик ошибок работает в паре с функцией trigger_error(), генерирующей ошибку. Это может быть использовано (подобно аналогичной конструкции работы с исключениями в C) для освобождения выделенных ресурсов (например, удаления созданных файлов), если сценарий не может нормально завершиться.
Функция, устанавливаемая в качестве обработчика ошибок, должна принимать пять параметров (три последних являются дополнительными и могут не обрабатываться):
код ошибки
строку, описывающую ошибку
имя сценария, в котором произошла ошибка
номер строки сценария, содержащей ошибку
контекст (массив, содержащий значения переменных, в момент возникновения ошибки)
<?// определить константы пользовательских ошибокdefine(FATAL, E_USER_ERROR);define(ERROR, E_USER_WARNING);define(WARNING, E_USER_NOTICE); // установить, какие ошибки должны обрабатываться в сценарииerror_reporting (FATAL | ERROR | WARNING); // пользовательский обработчик ошибокfunction myErrorHandler($errno,$errstr,$errfile,$errline) { switch ($errno) { case FATAL: echo "<b>Критическая ошибка</b> [$errno] $errstr<br>\n"; echo "в строке: $errline файла:".$errfile; echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>\n"; echo "Aborting...<br>\n"; exit -1; break; case ERROR: echo "<b>Ошибка</b> [$errno] $errstr<br>\n"; break; case WARNING: echo "<b>Предупреждение</b> [$errno] $errstr<br>\n"; break; default: echo "Неизвестный тип ошибки: [$errno] $errstr<br>\n"; }} // функция для проверки обработки ошибок// (масштабирование массиваfunction scale_by_log($vect, $scale) { if(!is_numeric($scale) || $scale <= 0) trigger_error("вычислить log(x) для x <= 0 нельзя. ", "(x = $scale)", FATAL); if(!is_array($vect)) { trigger_error("Требуется массив ", ERROR); return null; } for($i=0; $i<count($vect); $i++) { if(!is_numeric($vect[$i])) trigger_error("Элемент ($i) не число и его значением считается 0", WARNING); $temp[$i]=log($scale)*$vect[$i]; } return $temp;} // установить пользовательский обработчик ошибок$old_error_handler=set_error_handler("myErrorHandler"); $a=array(2,3,"foo",5.5,43.3,21.11);print_r($a); $b=scale_by_log($a,M_PI); // здесь выдается предупреждениеecho "Массив, масштабированный на логарифм(Пи): ";print_r($b); $c=scale_by_log("not array",2,3); // здесь ошибкаvar_dump($c); $d=scale_by_log($a, -2.5); // здесь критическая ошибка echo "Продолжение сценария...";?>
При выполнении сценария вывод будет следующим:
Array( [0] => 2 [1] => 3 [2] => foo [3] => 5.5 [4] => 43.3 [5] => 21.11)<b>Предупреждение</b> [1024] Элемент (2) не число, и его значением считается 0<br>Массив, масштабированный на логарифм(Пи): Array( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281)<b>Ошибка</b> [512] Требуется массив <br>NULL<b>Критическая ошибка</b> [256] вычислить log(x) для x <=0 нельзя, (x = -2.5)<br> в строке: 37, файла E:\www\exampl.php, PHP 4.0.5 (WINNT)<br>Aborting...<br>
Не забывайте, что при установке пользовательского обработчика ошибок стандартный обработчик PHP не используется. Установки error_reporting()
также не будут иметь эффекта, и пользовательский обработчик должен уметь обрабатывать все виды ошибок (значение error_reporting() можно выяснить и действовать соответсвенно). Заметьте, что код ошибки будет равен 0, если ошибка возникла в функции, вывод ошибок для которой был блокирован оператором "@".
Также помните, что завершать сценарий в обработчике необходимо явно (например, с помощью функции die()), если, конечно, в этом есть необходимость. Если обработчик ошибок завершается с помощью return, то выполнение сценария продолжается с того места, в котором возникла ошибка (то есть исполняются инструкции, которые следуют за той инструкцией, в которой возникла ошибка).
Установка ширины для всех колонок:
Если возникла необходимость установить для всех колонок ширину, отличную от установленной по умолчанию, то это можно сделать при помощи свойства StandardWidth() объекта ActiveSheet():
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ // Установить ширину для всех колонок$xls->ActiveSheet->StandardWidth = 5;?>
Установка заголовков ответа
Header
Вывод заголовка.
Синтаксис :
int Header(string $string)
Обычно функция Header() является одной из первых команд сценария. Она предназначена для установки заголовков ответа, которые будут переданы браузеру - по одному заголовку на вызов. Вызов Header() обязательно должен осуществляться до любого оператора вывода в сценарии - в противном случае вы получете предупреждение. Текст вне <? и ?> также рассматривается как оператор вывода.
Пример:
// перенаправляет браузер на сайт PHP
Header("Location: http://www.php.net");
// теперь принудительно завершаем сценарий, ввиду того, что после
// перенаправления больше делать нечего
exit;
Ваше мнение о сайте:
Просто супер! (15): | |||
Нормальный. (12): | |||
Так себе. (10): | |||
Мне все равно. (10): | |||
Плохой. (2): | |||
Хуже не видел! (1): |
Всего проголосовало: | |
50 человек |
Вставка/удаление элементов
array_pad
Добавляет в массив несколько элементов.
Синтаксис :
array array_pad(array input, int pad_size, mixed pad_value)
Функция array_pad() возвращает копию массива input, в который были добавлены элементы с значениями pad_value, так, что число элементов в получившемся массиве будет равно pad_size.
Если pad_size>0, то элементы будут добавлены справа, а если <0 - то слева.
В случае, если значение pad_sizeменьше элементов в исходном массиве input, то никакого добавления не произойдет, и функция вернет исходный массив input.
$arr = array(12, 10, 4);$result = array_pad($arr, 5, 0);// $result = array(12, 10, 4, 0, 0);$result = array_pad($arr, -7, -1);// $result = array(-1, -1, -1, -1, 12, 10, 4)$result = array_pad($arr, 2, "noop");// не добавит
array_pop
Извлекает и удаляет последние элементы массива.
Синтаксис :
mixed array_pop(array arr);
Функция array_pop() снимает элемент с "вершины" стека (то есть берет последний элемент списка) и возвращает его, удалив после этого его из arr. С помощью этой функции мы можем строить конструкции, напоминающие стек. Если массив arr был пуст, функция возвращает пустую строку.
$stack = array("orange", "apple", "raspberry");$fruits = array_pop($stack);// $fruit = "raspberry"// $stack = array("orange", "apple")
array_push
Добавляет элементы в конец массива.
Синтаксис :
int array_push(array arr, mixed var1 [, mixed var2, ..])
Эта функция добавляет к массиву arr элементы var1,var2 и т.д. Она присваивает им числовые индексы - точно так же, как это происходит для стандартных []. Если вам нужно добавить всего один элемент, наверное, проще будет воспользоваться этим оператором:
array_push($Arr,1000); // вызываем функцию$Arr[]=100; // то же самое, но короче
Обратите внимание, что функция array_push() воспринимает массив, как стек, и добавляет элементы всегда в его конец.
array_shift
Извлекает и удаляет первый элемент массива.
Синтаксис :
mixed array_shift(array arr)
Эта функция извлекает первый элемент массива arr и возвращает его. Она сильно напоминает array_pop(), но только получает начальный, а не конечный элемент, а также производит довольно сильную "встряску" всего массива: ведь при извлечении первого элемента приходится корректировать все числовые индексы у всех оставшихся элементов, т.к. все последующие элементы массива сдвигаются на одну позицию вперед.
$ar = array("-v", "-f");$opt = array(_shift($arr);// теперь $arr = array("-f"), а $opt = "-v"
array_unshift
Добавляет элементы в начало массива.
Синтаксис :
int array_unshift(list arr, mixed var1 [,mixed var2, ...])
Функция очень похожа на array_push, но добавляет перечисленные элементы не в конец, а в начало массива. При этом порядок следования var1, var2 и т.д. остается тем же, т.е. элементы как бы "вдвигаются" в список слева. Новым элементам списка, как обычно, назначаются числовые индексы, начиная с 0; при этом все ключи старых элементов массива, которые также были числовыми, изменяются (чаще всего они увеличиваются на число вставляемых значений). Функция возвращает новый размер массива.
$A = array(10,"a"=>20,30);array_unshift($A,"!","?");// теперь $A===array(0=>"!", 1=>"?", 2=>10, a=>20, 3=>30)
array_unique
Создает массив только из уникальных значений.
Синтаксис :
array array_unique(array arr)
Функция array_unique() возвращает массив, составленный из всех уникальных значений массива arr вместе с их ключами, путем удаления всех дублирующих значений. В результирующий массив помещаются первые встретившиеся пары ключ=>значение. Индексы сохраняются.
$input = array("a" => "green", "red", "b" => "green", "blue", "red");$result = array_unique($input);// теперь $result===("a"=>"green", "red", "blue");
PHP имеет следующие типы ошибок
PHP имеет следующие типы ошибок и предупреждений:
Значение |
Константа |
Описание |
1 |
E_ERROR |
Фатальная ошибка времени исполнения. |
2 |
E_WARNING |
Предупреждение времени исполнения. |
4 |
E_PARSE |
Сообщение интерпретации времени исполнения. |
8 |
E_NOTICE |
Простое сообщение времени исполнения. |
16 |
E_CORE_ERROR |
Фатальная ошибка при инициализации PHP. |
32 |
E_CORE_WARNING |
Предупреждение инициализации. |
64 |
E_COMPILE_ERROR |
Фатальная ошибка компиляции. |
128 |
E_COMPILE_WARNING |
Предупреждение компиляции. |
256 |
E_USER_ERROR |
Ошибки, определяемые пользователем. |
512 |
E_USER_WARNING |
Предупреждения, определяемые пользователем. |
1024 |
E_USER_NOTICE |
Сообщения, определяемые пользователем. |
2047 |
E_ALL |
Все перечисленные сообщения. |
Указанные значения в виде чисел или констант можно комбинировать, формируя битовую маску ошибок, о которых необходимо сообщать в ходе исполнения сценария. Для комбинирования используются битовые операторы, но в конфигурационном файле php.ini распознаются только "|", "~", "!" и "&".
В PHP 4 по умолчанию разрешены сообщения вида E_ALL & ~E_NOTICE, то есть сообщаться должно все, кроме обычных сообщений. Можно переопределить эту установку параметром файла конфигурации error_reporting() (ее также можно указывать в файлах конфигурации сервера Apache).
Если при вызове функции перед ее именем указать символ "@", то в случае возникновения ошибки в этой функции сообщение о нем выдаваться не будет.
В настоящее время оператор игнорирования ошибок блокирует даже выдачу сообщений о критических ошибках, при возникновении которых сценарий досрочно завершается.
Если разрешен параметр конфигурации track_errors, то сообщение об ошибке сохраняется в глобальной переменной $php_errormsg.
<?// определенный пользователем обработчик ошибокfunction userErrorHandler($errno,$errmsg,$filename,$linenum,$vars) { // время возникновения ошибки $dt=date("Y-m-d H:i:s (T)"); $errortype = array( 1 => "Error", 2 => "Warning", 4 => "Parsing Error", 8 => "Notice", 16 => "Core Error", 32 => "Core Warning", 64 => "Compile Error", 128 => "Compile Warning", 256 => "User Error", 512 => "User Warning", 1024 => "User Notice" ); $err.="время ($dt), номер ошибки ($errno), "; $err.="тип ошибки (".$errortype[$errno]."): "; $err.="\"$errmsg\".файл \"$filename\", строка ("; $err.=$linenum.")\n"; $user_errors=array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE); if(in_array($errno, $user_errors)) // выдать сообщение для ошибок пользователя echo $err; // сохранить событие ошибки в системном журнале error_log($err, 3, "/usr/local/php4/error.log");} // установить уровень контроля ошибок и обработчикerror_reporting(0); // не выводить сообщения PHP$old_error_handler=set_error_handler("userErrorHAndler"); // неопределенная константа вызывает предупреждение$t=_NOT_DEFINED_CONSTANT; trigger_error("Моя ошибка", E_USER_ERROR);trigger_error("Мое предупреждение", E_USER_WARNING); ?>
Данная группа функций позволяет управлять тем, как PHP при выполнении сценария выводит информацию. Это может быть полезно в различных ситуациях, в особенности при посылке браузеру HTML-заголовков (headers) после того, как сценарий начал выводить HTML-текст. (В обычном случае невозможно послать заголовок после того, как был начат вывод текста.)
Эти функции не воздействуют на заголовки, посланные функциями header() или setcookie(), а только на функции, подобные echo() и HTML-тексту между блоками PHP-кода.
<?php ob_start();echo "Hello\n" setcookie("cookiename", "cookiedata"); ob_end_flush(); ?>
В примере выше вывод командой echo() будет сохранен в буфере вывода до вызова функции ob_end_flush(). В то же время вызов setcookie() успешно сохраняет cookie, не вызывая ошибки.
PDF-функции позволяют PHP создавать PDF-файлы с помощью библиотеки PDF, созданной Томасом Мерзем (http://www.pdflib.com/pdflib/index.html); также могут потребоваться библиотеки JPEG (ftp://ftp.uu.net/graphics/jpeg/) и TIFF (http://www.libtiff.org/).
С pdflib поставляется хорошая документация, описывающая возможности библиотеки. Имена функций и аргументы идентичны в библиотеке и PHP. Размеры и координаты измеряются в единицах Postscript (72 на дюйм), но это зависит от выбранного разрешения.
Аналогом библиотеки является ClibPDF.
Версии ниже 3.0 pdflib не поддерживается в PHP 4.
<?php$fp = fopen("test.pdf". "w");$pdf = pdf_open($fp);pdf_set_info($pdf, "Author", "Uwe Streinmann");pdf_set_info($pdf, "Title", "Test for PHP PDFlib");pdf_set_info($pdf, "Creator", "See Author");pdf_set_info($pdf, "Subject", "Testing");pdf_begin_page($pdf, 595, 842);pdf_add_outline($pdf, "Page 1");pdf_set_font("$pdf, "Times-Roman", 30, "host");pdf_set_value($pdf, "textrendering", 1);pdf_show_xy($pdf, "Times Roman outlined", 50, 750);pdf_moveto($pdf, 50, 740);pdf_lineto($pdf, 330, 740);pdf_stroke($pdf);pdf_end_page($pdf);pdf_close($pdf);fclose($fp);echo "<A href=getpdf.php>finished</A>";?><?php// Сценарий getpdf.php просто возвращает документ pdf$fp = fopen("test.pdf", "r");header("Content-type: application/pdf");fpassthru($fp);fclose($fp);?>
Данная серия статей посвящена созданию документов Excel при помощи PHP. Данная возможнось может понадобиться, например, если нужно предоставить пользователю загружаемые данные в виде листов Excel. Это могут быть прайсы на продукцию, автоматически генерируемые из базы данных на сервере, либо какие-то документы, которые также необходимо представить в виде документов Excel.
Здесь рассматривается возможность работы с Excel-документами через COM-объект. К сожалению работа с COM-объектами в PHP возможна только на Windows-платформах. По-этому если Вы используете Unix-хостинг, то создавать и редактировать Excel-документы приведенным ниже способом не получится.
Работа с COM-объектами производится при помощи синтактсиса
$com_object = new COM($object);
где
$com_object - новый COM-объект;
$object
- id-класс требуемого объекта.
Для создания Excel-документов переменной $object необходимо задать значение "Excel.Application" либо "Excel.sheet".
$xsl = new COM("Excel.Application");
После создания нового COM-объекта, можно обращаться к его свойствам и методам:
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ $rangeValue = $xls->Range("A1");$rangeValue->Value = "В выделенном блоке текст будет жирный, подчеркнутый, наклонный";$rangeValue = $xls->Range("A2");$rangeValue->Value = "Шрифт будет иметь высоту 12";$rangeValue = $xls->Range("A3");$rangeValue->Value = "Имя шрифта - Times New Roman"; $range=$xls->Range("A1:J10"); // Определяем область ячеек$range->Select(); // Выделяем ее$fontRange=$xls->Selection(); // Присваиваем переменной выделенную область // Далее задаем параметры форматирования текста в выделенной области$fontRange->Font->Bold = true; // Жирный$fontRange->Font->Italic = true; // Курсив$fontRange->Font->Underline = true; // Подчеркнутый$fontRange->Font->Name = "Times New Roman"; // Имя шрифта$fontRange->Font->Size = 12; // Размер шрифта ?>
Далее в этом разделе я приведу примеры работы с основными наиболее исползуемыми свойствами и методами:
Открытие, запись, закрытие документа
Формат ячеек: Выравнивание
Формат ячеек: Шрифт
Работа со строками
Работа с колонками
Добавление / Удаление / Переименование листов
Рисование таблиц
Копирование / вставка ячеек
Выравнивание по горизонтали:
За выравнивание по горизонтали отвечает свойство HorizontalAlignment().
Выровнять значение можно как в одной ячейке, так и в диапазоне ячеек. Для этого надо выделить ячейку (или диапазон ячеек), и присвоить свойству HorizontalAlignment() одно из 8 предопределенных значений:
HorizontalAlignment = 1
- выравнивание по значению (используется по умолчанию);
HorizontalAlignment = 2
- выравнивание по левому краю;
HorizontalAlignment = 3
- выравнивание по центру;
HorizontalAlignment = 4
- выравнивание по правому краю;
HorizontalAlignment = 5
- выравнивание с заполнением;
HorizontalAlignment = 6
- выравнивание по ширине;
HorizontalAlignment = 7
- выравнивание по центру выделения;
HorizontalAlignment = 8
- распределение по горизонтали.
В приведенном ниже примере в верхней строчке таблицы "1:1" все значения будут выравниваться по центру.
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ // Выравниваем по центру$rangeAlignment = $xls->Range("1:1");$rangeAlignmeny->HorizontalAlignment = 3;$rangeAlignment->Value = "Hello";?>
Выравнивание по вертикали:
За выравнивание по вертикали отвечает свойство VerticalAlignment().
Так же как и по горизонтали, выровнять значение можно как в одной ячейке, так и в диапазоне ячеек. Для этого надо выделить ячейку (или диапазон ячеек), и присвоить свойству VerticalAlignment() одно из 5 предопределенных значений:
VerticalAlignment = 1
- выравнивание по верхнему краю;
VerticalAlignment = 2
- выравнивание по центру;
VerticalAlignment = 3
- выравнивание по нижнему краю (значение по умолчанию);
VerticalAlignment = 4
- выравнивание по высоте;
VerticalAlignment = 5
- распределение по вертикали.
В приведенном ниже примере в верхней строчке таблицы "1:1" все значения будут выравниваться по верхнему краю.
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ// Выравниваем по центру$rangeAlignment = $xls->Range("1:1");// Задаем выравнивание для ячеек: по верхнему краю$rangeAlignment->VerticalAlignment = 1;// Устанавливаем размер шрифта: 8$rangeAlignment->Font->Size = 8;// Устанавливаем высоту строки: 25$rangeAlignment->RowHeight = 25;// Выводим надпись: Hello$rangeAlignment->Value = "Hello";?>
Выражения
if
Позволяет организовывать выполнение фрагментов кода по условию.
Синтаксис :
if (выражение) statement
Может иметь неограниченную степень вложенности в другие IF.
if($a>$b) print "$a больше $b";if($a>$b){echo "$a больше $b;$b=$a;}
else
Расширяет возможности IF по части обработки вариантов выражения, когда оно равно FALSE.
Выражение ELSE выполняется только если IF равно FALSE.
if ($a>$b) { echo "a больше b";} else { echo "a меньше b";}
elseif
Является комбинацией IF и ELSE. Позволяет выполнить выражение, если значение IF равно FALSE, но в отличии от ELSE оно выполниться, если выражение ELSEIF равно TRUE.
if ($a>$b) { echo "a больше b";} elseif ($a==$b) { echo "a равно b";} else { echo "a меньше b";}
if_endif
Один из возможных вариантов группирования операторов с оператором IF.
Удобно при внедрении больших блоков HTML-кода внутрь оператора IF.
if ($a==1): echo "a равно 1";elseif ($a==2): echo "a равно 2";else: echo "а не равно 1 и 2";endif;<?php if ($a==5):?>A=5<?php endif;?>-Блок HTML-кода A=5 будет виден, если выполнется условие $a==5
while
Простейший тип цикла в PHP. Заставляет PHP выполнять вложенные операторы до тех пор, пока условие равно TRUE. Если условие равно FALSE с самого начала, то цикл не выполнится не разу.
Синтаксис : WHILE(условие)выражения
Можно сгруппировать несколько операторов внутри фигурных скобок или использовать альтернативный синтаксис :
WHILE(условие)выражения... ENDWHILE;
$a=1;while ($a<=5) { echo $a++; }$a=1;while ($a<=5): echo $a; $a++;endwhile;
- Эти два примера выводят номера с 1 до 5.
do_while
Цикл, аналогичный WHILE, но значение логического выражения проверяется не до, а после окончания итерации. Основное отличие - то что цикл хоть один раз но выполнится.
$a=1;do { echo $a;} while ($a>1);
Можно прекратить использовать блок операторов в середине путем внедрения оператора BREAK в цикл DO..WHILE(0) :
do { if ($a==5) { echo "A равно 5" break; } $a *= $b; if ($a<$minimum) { break; } echo "A равен $a";} while(0);
for
Наиболее мощный цикл в PHP.
Синтаксис :
FOR (условие1; условие2; условие3)выражения
условие1 - Безусловно выполняется (вычисляется) в начале цикла
условие2 - Проверяется в начале каждой итерации. Если оно равно TRUE, то цикл продолжается и выполняются вложенные операторы. Если оно равно FALSE, то цикл заканчивается.
условие3 - Выполняется (вычисляется) в конце каждой итерации.
Каждое из этих условий может быть пустым.
Пример 1:for ($a = 1; $a <= 5; $a++) { echo $a;} Пример 2:for ($a = 1;;$a++) { if ($a > 5) { break; } echo $a;}Пример 3:$a = 1;for (;;) { if ($a > 5) { break; } print $a; $a++;}Пример 4:for ($a = 1; $a <= 5; print $a, $a++);
PHP поддерживает альтернативный синтаксис FOR:
FOR(усл1; уcл2; усл3;):операторы;...;ENDFOR;
break
Прерывает выполнение текущего цикла.
Пример :$a = 0;while ($a < 5) { if ($arr[$a] == "stop") { break; } $a++;}
continue
Переходит на начало ближайшего цикла.
while (list($key,$value) = each($arr)) { if ($key % 2) { continue; } do_something_odd ($value);}
switch
Сравнивает переменную или выражение с различными значениями и выполняет различные фрагменты кода в зависимости от того, чему будет равно значение выражения.
switch ($a) { case 0: echo "A равно 0"; break; case 1: echo "A равно 1"; break; case 2: echo "A равно 2"; break; default: echo "A не равно 0, 1, 2";}
default - соответствует всем значениям, которые не удовлетворяют другим CASE. CASE - могут быть любого скалярного типа, т.е. целые числа или числа с плавающей запятой и строки.
require
Заменяет себя содержимым указанного файла.
Пример :
require("include.inc");
Но его нельзя поместить внутрь цикла и ожидать, что он включит содержимое другого файла несколько раз в процессе каждой итерации. Для этого есть INCLUDE.
include
Вставляет и выполняет содержимое указанного файла.
$files = array ("first.inc", "second.inc", "third.inc");for ($a = 0; $a < count($files); $a++) { include($files[$a]);}
Так как INCLUDE() это специальный оператор, требуется заключать его в фигурные скобки при использовании внутри условного оператора.
if ($a < 5) { include("file_1.inc");} else { include("file_2.inc");}
function
Объявление функции.
Внутри функции может быть любой верный код PHP, даже объявление другой функции или класса. Функции должны быть объявлены перед тем, как на них ссылаться.
function foo ($arg_1, $arg_2,...,$arg_n) { echo "Пример функции."; return $retvalue;}
Возвращение результатов :
Результаты возвращаются через необязательный оператор return.
Возвращаемый результат может быть любого типа, включая списки и объекты.
function my_sqrt ($num) { return $num * $num;}echo my_sqrt(4); //выведет 16
Множественные результаты не могут быть возвращены в качестве результата, но вы можете реализовать это путем возврата списка :
function foo() { return array (0, 1, 2);}list ($zero, $one, $two) = foo();
Аргументы :
Информация может быть передана функции через список аргументов, которые являются разделенным запятыми списком переменных и/или констант.
Списки аргументов переменной длины не поддерживаются, но того же можно достичь, передавая массивы.
function takes_array($input) { echo "$input[0] + $input[1] = ", $input[0]+$input[1];}
Передача по ссылке :
По умолчанию, аргументы функции передаются по значению. Для изменения аргументов в функции их надо передавать по ссылке.
Для этого надо поставить амперсанд (&) перед именем аргумента в объявлении функции :
function foo( &$bar) { $bar .= "и добавочная строка.";}$str = "Это строка, ";foo($str);echo $str; // выведет : "Это строка, и добавочная строка."function foo($bar) { $bar .= "и добавочная строка.";}$str = "Это строка, ";foo($str);echo $str; //выведет : "Это строка, "foo(&$str);echo $str; //выведет : "Это строка, и добавочная строка."
Значения по умолчанию :
Значение по умолчанию должно быть константой, а не переменной или членом класса.
function day ($type = "понедельник") { echo "Сегодня $type.";}echo day(); //выведет : Сегодня понедельник.echo day("вторник"); //выведет : Сегодня вторник.
Аргументы по умолчанию при описании должны находиться справо от остальных аргументов.
function day($day_num, $type = "понедельник") { return "Сегодня $day_num - $type.";}
old_function
Оператор OLD_FUNCTION позволяет вам определяить функцию используя синтаксис PHP/FI2 (за исключением того, что вы должны заменить "function" на "old_function").
Это свойство только для совместимости и должно использоваться лишь конверторами PHP/FI2 -> PHP3. Описанные таким образом функции не могут быть вызваны из служебного кода PHP. Вы можете обойти это путем введения специальной функции в терминах PHP3, которая будет вызывать OLD_FUNCTION.
class
Набор переменных и функций, работающих с этими переменными.
<?phpclass Cart { var $items; // Количество вещей в корзине покупателя // Добавить $num наименований типа $artnr в корзину function add_item ($artnr, $num) { $this->items[$artnr] += $num; } // Убрать $num наименований $artnr из корзины function remove_item ($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return true; } else { return false; } }}?>
Классы это типы, то есть, заготовки для реальных переменных. Вы должны создавать переменные желаемого типа, используя оператор new :
$cart = new Cart;
$cart->add_item("10", 1);
Классы могут быть расширениями других классов. Расширенный класс обладает всеми переменными и функциями базового класса и тем, что вы определите при расширении класса. Это делается используя ключевое слово extends :
class Named_Cart extends Cart { var $owner; function set_owner ($name) { $this->owner = $name; }}
Это определяет класс Named_Cart, который имеет все переменные и функции класса Cart плюс дополнительную переменную $owner и дополнительную функцию set_owner(). Вы можете создать поименованую корзину обычным образом и установить или получить владельца корзины. Также вы можете использовать и нормальные функции корзины в поименованой корзине :
$ncart = new Named_Cart; //Создать корзину$ncart->set_owner ("kris");//Указать владельцаprint $ncart->owner; //Распечатать имя владельца корзины$ncart->add_item ("10", 1);//унаследовано из обычной корзины
Часть 2. Функции работы с данными
Математические функции
Зачем нужны сессии. Механизм работы сессий
Зачем нужны сессии.
Сессия представляет собой механизм, позволяющий хранить некоторые данные, индивидуальные для каждого пользователя (например, его имя и номер счета), между запусками сценария.
В Web-программировании есть один класс задач, который может вызвать довольно много проблем, если писать сценарий "в лоб". Речь идет о слабой стороне CGI - невозможности запустить программу на длительное время, позволив ей при этом обмениваться данными с пользователями.
Представте, что мы пишем форму, но в ней такое большое число полей, что было бы глупо поместить их на одну страницу. Нам нужно разбить процесс заполнения формы на несколько этапов, или стадий, и представить их в виде отдельных HTML-документов.
Например, в первом документе с диалогом у пользователя может запрашиваться его имя и фамилия, во втором - данные о его месте жительства, и в третьем - номер кредитной карточки. В любой момент можно вернуться на шаг назад, чтобы исправить те или иные данные. Наконец, если все в порядке, накопленная информация обрабатывается - например, помещается в базу данных.
Реализация такой схемы оказывается для Web-приложений довольно нетривиальной проблемой. Действительно, нам придется хранить все ранее введенные данные в каком-нибудь хранилище, которое должно аннулироваться, если пользователь вдруг передумает и уйдет с сайта. Для этого можно использовать функции сериализации и файлы. Однако ими мы решаем только половину проблемы: нам нужно как то привязать конкретного пользователя к конкретному временному хранилищу. Действительно, предположим, мы этого не сделали. Тогда, если в момент заполнения какой-нибудь формы одним пользователем на сайт зайдет другой и тоже попытается ввести свои данные, получится белеберда.
Все эти проблемы решаются при помощи сессий.
Механизм работы сессий.
Для начала должен существовать механизм, который бы позволил PHP идентифицировать каждого пользователя, запустившего сценарий. То есть при следующем запуске PHP нужно однозначно определить, кто его запустил: тот же человек, или другой. Делается это путем присвоения клиенту так называемого уникального идентификатора сессии. Чтобы этот идентификатор был доступен при каждом запуске сценария, PHP помещает его Cookies браузера. Теперь, зная идентификатор (дальше SID), PHP может определить, в каком же файле на диске храняться данные пользователя.
Задание цвета текста:
Цвет текста задается при помощи свойства ColorIndex() все того же объекта Font().
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ $range = $xls->Range("A1");$range->Value = "Текст будет написан красным";$range->Font->ColorIndex = 3;?>
Есть одна особенность: цвет текста задается не в каком-либо формате (RGB, CMYK и т.д.), а номером, под которым он находится в палитре Excel-а.
Всего в палитре присутствует 55 цветов и одно значение отводиться под автоцвет. Итого при помощи свойства ColorIndex() можно задать 56 значений цвета.
Следующий пример выведет в документе Excel все возможные значения свойства ColorIndex():
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ $min_color_index=0; // Начальный индекс цвета$max_color_index=55; // Конечный индекс цвета$start_position=2; // Номер позиции, с которой начнется показ // индексов цвета// Выводим надпись "Номер цвета"$range = $xls->Range("A1:B1");$range->Font->Bold = true;$range = $xls->Range("A1");$range->Value = "Номера цветов"; // Выводим значения индексов цвета и окрашиваем эти значения// соответствующим цветомfor($i=$min_color_index;$i<=$max_color_index;$i++) { $range = $xls->Range("A".($i+$start_position)); $range->Value = "ColorIndex = ".$i; $range->Font->ColorIndex = $i;};?>
Задание отступа:
Отступ в ячейке задается при помощи свойства IndentLevel().
Этому свойству приравнивают значение, равное количеству знаков, на которые нужно сместить данные влево.
В следующем примере мы в ячейку A1 запишем текст с отступом в 5 знаков, а в ячейку A2 - без отступа:
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ // Задание отступа$rangeAlignment = $xls->Range("A1");$rangeAlignment->IndentLevel = 5;$rangeAlignment->Value = "Отступ равен 5 символам"; // Без отступа$rangeAlignment = $xls->Range("A2");$rangeAlignment->Value = "Без отступа";?>
Задание ширины колонки:
Принцып задания ширины колонки или группы колонок в целом аналогичен заданию высоты строк за исключением того, что за ширину отвечает свойство ColumnWidth() а не RowHeight(). Высота задается в миллиметрах.
В следующем примере для столбца "A:A" задается ширина 40 мм:
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ// Изменение ширины столбца$range=$xls->Range("A:A"); // Выбираем 1-й столбец$range->Select(); // Выделяем его$cellRange=$xls->Selection; // Определяем $cellRange как выделенный фрагмент$cellRange->ColumnWidth = 40; // Устанавливаем ширину столбца?>
По аналогии можно задать ширину для нескольких колонок
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ // Изменение ширины колонок$range=$xls->Range("A:E"); // Выбираем колонки с A по E$range->Select(); // Выделяем их$cellRange=$xls->Selection; // Определяем $cellRange как выделенный фрагмент$cellRange->ColumnWidth = 40; // Устанавливаем ширину колонок?>
Задание высоты строки:
Задать высоту строки можно при помощи свойства RowHeight. Высота задается в миллиметрах.
В следующем примере для строки "2:2" задается высота 25 мм:
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ// Изменение высоты строки$range=$xls->Range("2:2"); // Выбираем 2-ю строку$range->Select(); // Выделяем ее$rowRange=$xls->Selection; // Определяем $rowRange как выделенный фрагмент$rowRange->RowHeight = 25; // Устанавливаем высоту строки?>
По аналогии можно задать высоту для нескольких строк:
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add(); // Добавляем новый документ // Изменение высоты строки$range=$xls->Range("2:7"); // Выбираем строки со 2-ой по 7-ю$range->Select(); // Выделяем их$rowRange=$xls->Selection; // Определяем $rowRange как выделенный фрагмент$rowRange->RowHeight = 25; // Устанавливаем высоту строк?>
Закрытие документа:
Закрытие документа производится методом Quit().
<?php$xls = new COM("Excel.Application"); // Создаем новый COM-объект$xls->Application->Visible = 1; // Заставляем его отобразиться$xls->Workbooks->Add();$range=$xls->Range("A1"); // Выбрали ячейку A1$range->Value = "Что-то записываем"; // Вставили значение // Сохраняем документ$xls->Workbooks[1]->SaveAs("test.xls"); $xls->Quit(); //Закрываем приложение $xls->Release(); //Высвобождаем объекты$xls = Null; $range = Null;?>
Закрытие файла
fclose
Закрывает файл, открытый предварительно функцией fopen().
Синтаксис :
int fclose(int $fp)
Возвращает false, если файл закрыть не удалось (например, что-то с ним случилось или же разорвалась связь с удаленным хостом). В противном случае возвращает значение "истина".
Всегда нужно закрывать FTP- и HTTP-соединения, потому что в противном случае "беспризорный" файл приведет к неоправданному простою канала и излишней загрузке сервера. Кроме того, успешно закрыв соединение, вы будете уверены в том, что все данные были доставлены без ошибок.
Запрет кэширования посредством PHP
Большинство сценариев формируют документы, которые при каждом запуске программы изменяются. Очевидно, если браузер пользователя начнет кэшировать такие документы, ничего хорошего не получиться.
Запретить кэшировать документы браузером и Proxy-серверами можно при помощи средст языка PHP, а именно функции Header().
Для этого надо использовать в начале сценария следующие команды:
Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); //Дата в прошлом
Header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
Header("Pragma: no-cache"); // HTTP/1.1
Header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT");
Для полного запрета кэширования приходиться всегда посылать 4 указанных заголовка, и ни один пропустить нельзя - в противном случае не сработает либо браузер, либо Proxy-сервер.