Oracle Adabas D Sybase FilePro mSQL Velocis MySQL Informix Solid dBase ODBC Unix dbm PostgreSQL
PHP был задуман где-то в конце 1994 года Расмусом Ледорфом(Rasmus Lerdorf). Ранние невыпущенные версии использовались на его домашней странице для того, чтобы следить за тем кто просматривал его интерактивное резюме. Первая используемая версия cтала доступна где-то в начале 1995 и была известна как Personal Home Page Tools. Она состояла из очень упрощенного движка синтаксического анализатора, который понимал только несколько специальных макрокоманд и ряд утилит, которые затем были в общем использовании на домашних страницах. Гостевые книги, счетчики и некоторые другие дополнения.
Довольно трудно дать какую-либо жесткую статистику, но отмечено, что к 1996 г. PHP/FI был использован по крайней мере на 15,000 веб-сайтах во всем мире. В середине 1997г. эта цифра выросла до более чем 50,000. В середине 1997г. также наблюдалось изменение в разработке PHP. Из частного любимого проекта Расмуса, которому способствовала горстка людей , это превратилось в намного более организованную рабочую группу. Синтаксический анализатор был заново переписан Зевом Сураски(Zeev Suraski) и Анди Гутмансом(Andi Gutmans), и этот новый синтаксический анализатор стал основой для PHP Версии 3.
Сегодня ( в середине -1998г.) как PHP/FI так и PHP3 поставляется с рядом
Это руководство по установке поможет Вам установить и сконфигурировать PHP3 на Ваших web серверах под Windows 9x/NT. Данное руководство составил Bob Silva. Последнюю версию можно найти по адресу http://www.umesd.k12.or.us/php/win32install.html.
Данное руководство обеспечивает поддержку установки на:
Personal Web Server (рекомендуется новейшая версия) |
Internet Information Server 3 or 4 |
Apache 1.3.x |
Omni HTTPd 2.0b1 |
Все модули теперь начинаются с префикса 'php3_'. Вы должны изменить свой файл php3.ini и/или все сценарии загрузки расширений с функцией dl() (либо везде удалите префикс 'php3_'). Это предотвратит путаницу между модулями PHP и их библиотеками обеспечения.
ChangeLog, FAQ и обновленную документацию всегда можно найти на официальном сайте PHP или любом из его зеркал.
Данные шаги должны быть выполнены при любой установке перед специфическими инструкциями сервера:
Распакуйте дистрибутивный файл в директорию по Вашему выбору. Неплохим вариантом будет "C:\PHP3\".
Скопируйте файл 'php3-dist.ini' в Вашу директорию '%WINDOWS%' и переименуйте его в 'php3.ini'. Ваша директория '%WINDOWS%' обычно:
c:\windows for Windows 95/98 |
c:\winnt or c:\winnt40 for NT servers |
Отредактируйте Ваш файл 'php3.ini':
вам потребуется изменить 'extension_dir' на путь к Вашей установочной директории PHP, либо куда Вы поместили файлы 'php3_*.dll' (например c:\php3);
установите 'doc_root' в путь, где располагается document_root web сервера (например c:\apache\htdocs или c:\webroot);
выберите, какие модули Вы желаете загружать при старте PHP. Вы можете раскомментировать линии 'extension=php3_*.dll' для загрузки соответствующих модулей. Некоторые модули требуют дополнительной установки некоторых библиотек в систему для корректной работы. В FAQ PHP можно получить больше информации о том, где получить библиотеки поддержки. Вы можете также загружать модули динамически, используя в сценарии dl("php_*.dll");
на PWS и IIS Вы можете установить browscap.ini в директории 'c:\windows\system\inetsrv\browscap.ini' для Windows 95/98 и 'c:\winnt\system32\inetsrv\browscap.ini' для Windows NT. Дополнительную информацию по использованию browscap в PHP можно на зеркале mirror, выберите кнопку "source", чтобы увидеть это в действии;
Рекомендуемый метод конфигурирования этих серверов состоит в использовании INF файлов, поставляемых с дистрибутивом (php_iis_reg.inf). Вы можете отредактировать этот файл и убедитесь, что расширения и установочная директория PHP соответствует Вашим параметрам. Или Вы можете следовать перечисленным ниже шагам, чтобы сделать это вручную.
ПРЕДУПРЕЖДЕНИЕ: Эти шаги включают в себя непосредственную работу с windows registry. Мы настоятельно рекомендуем вам сначала сделать резервную копию registry. Группа разработчиков PHP не несет ответственности, если Вы повредите Ваш registry.
Запустите Regedit;
Перейдите к: HKEY_LOCAL_MACHINE /System/CurrentControlSet /Services /W3Svc /Parameters/ScriptMap.
В меню редактирования выберите New->String Value.
Определите расширение, которое Вы хотите использовать для ваших сценариев PHP (например .php3).
Дважды щелкните на значении новой строки и введите путь к php.exe exe в поле данных (например c:\php3\php.exe %s %s). '%s %s' ОЧЕНЬ важны, PHP не будет работать без этого должным образом;
Повторите эти шаги для каждого расширения, которое Вы хотите ассоциировать со сценариями PHP;
Теперь перейдите к HKEY_CLASSES_ROOT;
В меню редактирования выберите New->Key;
Определите ключ к расширению, которое Вы установили в предыдущем разделе (например .php3
Выделите новый ключ, в правой части окна дважды щелкните "default value" и введите phpfile.
Повторите последний шаг для каждого расширения, которое Вы установили в предыдущей секции;
Теперь создайте другой New->Key под HKEY_CLASSES_ROOT и это имя phpfile.
Выделите новый ключ phpfile phpfile и в правой части окна, дважды щелкните "default value" и введите PHP Script.
Щелкните правой клавишей на phpfile и выберите New->Key, это имя Shell.
Щелкните правой клавишей на Shell и выберите New->Key, это имя open.
Щелкните правой клавишей на open и выберите New->Key, это имя command.
Выделите новый ключ command и в правой части окна дважды щелкните на "default value" и введите путь к php.exe. Например: c:\php3\php.exe -q %1. (не забудьте %1).
Выйдите из Regedit;
Пользователи PWS и IIS 3 теперь имеют полностью работающую систему. Пользователи IIS 3 могут использовать tool от Steven Genusa для конфигурирования своих карт сценариев.
Для установки PHP3 на NT Server с запущенным IIS4 следуйте следующим инструкциям:
В Internet Service Manager (MMC) выберите Web site или отправной каталог приложения;
Откройте меню свойства каталога (щелкните правой клавишей мыши и выберите свойства) и тогда щелкните Home Directory, Virtual Directory или Directory tab;
Щелкните кнопку Configuration и тогда выберите App Mappings tab;
Щелкните Add, в рамке Executable наберите c:\path-to-php-dir\php.exe %s %s. Вы ДОЛЖНЫ подставить в конце %s %s , PHP не будет функционировать правильно, если Вы этого не сделаете;
В рамке Extension определите расширение файла, которое Вы желаете ассоциировать со сценариями PHP (обычно (.php3 и .phtml);
Установите требуемую безопасность (это делается в Internet Service Manager) и, если Ваш NT Server использует файловую систему NTFS, добавьте права на исполнение для директории I_USR_, которая содержит php.exe.
Вы должны редактировать Ваш файл srm.conf или httpd.conf , чтобы сконфигурировать Apache для работы с исполняемыми PHP CGI.
Хотя может быть несколько вариантов конфигурирования PHP под Apache, это делается достаточно просто даже для новичка. Пожалуйста, обратитесь к документации по Apache для получения информации о директивах конфигурации.
ScriptAlias /php3/"c:/path-to-php-dir/php.exe"
AddType application/x-httpd-php3 .php3
AddType application/x-httpd-php3 .phtml
Action application/x-httpd-php3 "php3/php.exe"
Для обеспечения возможности использования исходного текста, просто создайте файл сценария PHP и вставьте этот код в: . Substitute original_php_script.php3php3 с именем желательного файла источника (это только один из путей). Обратите внимание, что на Win-Apache все обратные слеши в пути предложения, такого как "c:\directory\file.ext" должны быть заменены на прямые.
Данная конфигурация должно быть самая простая:
Шаг 1: Установите Omni server; |
Щелкните правой клавишей на голубой иконке OmniHTTPd в system tray и выберите Properties |
Шаг 3: Щелкните на Web Server Global Settings |
Шаг 4: На 'External' tab введите: virtual = .php3 | actual = c:\path-to-php-dir\php.exe |
Шаг 5: На Mime tab, введите: virtual = wwwserver/stdcgi | actual = .php3 |
Шаг 6: Щелкните OK |
Повторите шаги 2 - 6 для каждого расширения, которое Вы желаете ассоциировать с PHP.
Таблица 3-1. Модули PHP
php3_calendar.dll | Функции преобразования календаря |
php3_crypt.dll | Функции шифрования |
php3_dbase.dll | Функции баз данных |
php3_dbm.dll | Эмуляция GDBM посредством Berkely DB2 library |
php3_filepro.dll | Доступ READ ONLY к базам данных filepro |
php3_gd.dll | Библиотека функций GD для манипуляций с gif |
php3_hyperwave.dll | Функции HyperWave |
php3_imap4r2.dll | Функции IMAP 4 |
php3_ldap.dll | Функции LDAP |
php3_msql1.dll | Клиент mSQL 1 |
php3_msql2.dll | Клиент mSQL 2 |
php3_mssql.dll | Клиент MSSQL (требует MSSQL DB-Libraries) |
php3_mysql.dll | Функции MySQL |
php3_nsmail.dll | Функции Netscape mail |
php3_oci73.dll | Функции Oracle |
php3_snmp.dll | Функции SNMP (только для NT!) |
php3_zlib.dll | Функции ZLib |
Пример 1. Dir() Пример
$d = dir("/etc"); echo "Handle: ".$d->handle."<br>\n"; echo "Path: ".$d->path."<br>\n"; while($entry=$d->read()) { echo $entry."<br>\n"; } $d->close(); |
Пример 1. Вывод всех файлов в текущем каталоге
<?php $handle=opendir('.'); echo "Directory handle: $handle\n"; echo "Files:\n"; while ($file = readdir($handle)) { echo "$file\n"; } closedir($handle); ?> |
Содержание mail Функция mail() позволяет отсылать почту. mail mail -- шлет почту Описание. bool mail(string to, string subject, string message, string additional_headers); Mail() автоматически посылает сообщение, содержащееся в message адресату, указанному в to. Несколько получателей могут быть указаны в поле to в виде строки с адресами, разделенными пробелами. Пример 1. Посылка почты. mail("rasmus@lerdorf.on.ca", "Моя тема", "Строка 1\nСтрока 2\nСтрока 3"); Если задан четвертый строковый аргумент, он автоматически вставляется в конец заголовка. обычно это используется при добавлении дополнительных полей в заголовок. Несколько дополнительных полей разделяются символом новой строки. Пример 2. Посылка почты с дополнительными полями заголовка. mail("ssb@guardian.no", "the subject", $message, "From: webmaster@$SERVER_NAME\nReply-To: webmaster@$SERVER_NAME\nX-Mailer: PHP/" . phpversion());
Календарные функции - доступны только если Вы скомпилировали календарное расширение в dl/calendar. Смотрите dl/README для получения инструкций.
Календарное расширение в PHP представляет серию функций, которая упрощает преобразование между разными календарными форматами. Посредником прообразования является дневной Юлианский счет. Дневной Юлианский счет это самый старый счет дней (около 4000 д.э.). Чтобы менять числа между разными календарными системами, Вы должны сначала преобразовать вашу дату в дневной Юлианский счет, а только затем в календарную систему по вашему выбору. Дневной Юлианский счет отличается от Юлианского Календаря! Более подробно о календарной систем смотрите на сайте: http://genealogy.org/~scottlee/cal-overview.html. Отрывки с этой страницы включаются в данной инструкцие.
string jdtogregorian
(int julianday);
Преобразование дневного Юлианcкого счета в Грегорианскую в формате "месяц/день/год"
int gregoriantojd
(int month, int day, int year);
Правильный дипазон для Грегорианского календаря 4714 д.э. до 9999 н.э.
Хотя это программное обеспечение может оперировать даты в обратном порядке до 4714 д.э., такое использование может быть бесполезно и не значительно. Грегорианский календарь не был учрежден до Октября 15, 1582 (или Октябрь 5, 1582 в Юлианском календаре). Некоторые страны еще очень долго не принимали его. Например, Великобритания преобразовалась в 1752, СССР в 1918 и Греции в 1923. Наиболее Европейские страны использовали Юлианский Календарь До Грегорианского.
Пример 1. Календарные функции <?php $jd = GregorianToJD(10,11,1970); echo("$jd\n"); $gregorian = JDToGregorian($jd); echo("$gregorian\n"); ?> JDToJulianJDToJulian -- преобразовывает дату Юлианского календаря на дневный Юлианский счетОписаниеstring jdtojulian (int julianday);
Преобразование дневного Юлианского счета в строку, содержащую дату Юлианского Календаря в формате "месяц/день/год". JulianToJDJulianToJD -- преобразовывает дату Юлианского Календаря на дневной Юлианский счетОписаниеint juliantojd (int month, int day, int year);
Правильный дипазон для Юлианского календаря 4713 д.э. до 9999 н.э. Хотя это программное обеспечение может оперировать даты в обратном порядке до 4713 д.э. такое использование может быть бесполезно и не значительно. Календарь был создан в 46 д.э., но подробные не стабилизировался до по крайней мере 8 н.э., и возможно познее в 4-ом столетии. Также, начало года различно от одной культуры к другой - не все соглашаются, что Январь это первый месяц. JDToJewishJDToJewish -- преобразовывает дневной Юлианский счет в Еврейский календарьОписаниеstring jdtojewish (int julianday);
Преобразование дневного Юлианского счета в Еврейский календарь JewishToJDJewishToJD -- преобразовывает дату в Еврейском Календаре на дневной Юлианский счетОписаниеint jewishtojd (int month, int day, int year);
Еврейский календарь использовался в течение нескольких тысячалетий, но в течение начального периода не было никакой формулы, чтобы определить начало месяца. Новый месяц начинался когда замечено полнолуние. JDToFrenchJDToFrench -- преобразовывает дневной Юлианский счет в Французский Республиканский календарьОписаниеstring jdtofrench (int month, int day, int year);
преобразовывает дневной Юлианский счет в Французский Республиканский календарь FrenchToJDFrenchToJD -- преобразовывает дату и Французского Республиканского календаря в дневной Юлианский счетОписаниеint frenchtojd (int month, int day, int year);
преобразовывает дату и Французского Республиканского календаря в дневной Юлианский счет Эта программа преобразовывают даты в начиная с 1 до 14 (Грегорианские даты 22 Сентября 1792 до 22 1806 Сентября). Это покрывает тот период когда календарь использовался. JDMonthNameJDMonthName -- возвращает название месяцаОписаниеstring jdmonthname (int julianday, int mode);
Возвращает строку с названием месяца. Стол 1. Календарные способы
JDDayOfWeekJDDayOfWeek -- Возвращает день неделиОписаниеmixed jddayofweek (int julianday, int mode);
Возвращает день недели. Может возвратить строку( Стол 1. Календарные недельные пути
Глава 4. КонфигурацияФайл php3.iniФайл php3.ini читается при запуске синтаксического анализатора PHP. Для версий серверного модуля PHP, это случается только один раз, когда запускается веб-сервер. Для версии CGI это случается на каждом вызове. Только для каждой директивы указанной здесь, имеется соответствующая директива Apache в httpd.conf. Просто добавьте Вы можете посмотреть установочные параметры большинства значений конфигурации вызвав функцию phpinfo(). Основные директивы конфигурации
Директивы Конфигурации Почты
Директивы Конфигурации Safe Mode
Debugger Configuration Directives
Директивы Загрузки Расширений(Extension Loading)
Директивы конфигурации MySQL
Директивы конфигурации mSQL
Директивы конфигурации Postgres
Директивы Конфигурации Sybase
Директивы Конфигурации Sybase-CT
Директивы Конфигурации BC Math
Директивы Конфигурации Возможностей Броузера
Директивы Конфигурации Унифицированных ODBC
Модуль ApacheДирективы конфигурации модуля ApacheМодуль CGI переадресации module/actionCGIВиртуальные хостыБезопасностьPHP - мощный язык и интерпретатор, независимо от того, включен ли он в веб-сервер как модуль или выполняется как разделение исполнимых файлов(binary) CGI, он может иметь доступ к файлам, выполнять команды и открывать сетевые соединения на сервере. Эти свойства дают возможность выполнять что-нибудь на веб-сервере небезопасное по умолчанию. С правильным выбором compile-time и runtime опций конфигурации он дает вам как раз ту комбинацию свободы и безопасности, которая вам нужна. Как есть много разных путей использования PHP, есть и большой выбор конфигураций, управляющих поведением PHP. Большой выбор опций гарантирует, что вы можете использовать PHP для многих целей, но это также означает что есть комбинации этих опций и, также, конфигураций сервера, которые заканчиваются небезопасной установкой. Эта глава объясняет различные комбинации опций конфигурации и ситуации, в которых они могут быть удачно использованы. CGI binaryВозможные атакиИспользование PHP как исполнимых файлов CGI - выбор для установок, которые по некоторой причине не хотят внедрить PHP как модуль в программное обеспечение сервера (подобно Apache), или PHP будет использоваться с другими типами оболочек CGI, чтобы создать надежное окружение chroot и setuid для сценариев. Эта установка обычно включает установку выполняемого(binary) PHP в каталог cgi-bin на веб-сервере. Бюллетень CERT CA-96.11 рекомендует кроме того, устанавливать любые интерпретаторы в cgi-bin. Даже если исполнимый PHP может быть использован в качестве автономного интерпретатора, PHP разработан для того чтобы предохранить от атаки, которую эта установка делает возможной:
Вариант 1: обслуживаются только общие(public) файлы Если ваш сервер не имеет какой-либо информации, которая не ограничивается паролем или управлением доступом на основе ip, нет потребности в этих опциях конфигурации. Если ваш веб-сервер не позволяет вам производить перенаправление, или сервер не имеет пути, чтобы связаться с исполнимым PHP, который запрашивает благополучно перенаправленный запрос, вы можете указать опцию --disable-force-cgi-redirect для конфигурирования сценария.
Перенаправление может быть сконфигурировано, например в Apache, директивами AddHandler и Action (см. ниже). Вариант 2: использование --enable-force-cgi-redirectЭта compile-time опция предохраняет от вызова PHP напрямую с URL подобно http://my.host/cgi-bin/php/secretdir/script.php3. Вместо того чтобы выполнить запрос, PHP выполняет только грамматический разбор в этом способе если он выполнил правила перенаправления вебсервера. Обычно переадресация в конфигурации Apache сделана со следующими директивами: Action php3-script /cgi-bin/php AddHandler php3-script .php3 Эта опция была протестирована только с веб-сервером Apache, и полагается на Apache чтобы установить не-стандартную внешнюю переменную CGI REDIRECT_STATUS для перенаправленных запросов. Если ваш сервер паутины не поддерживает какого-либо способа сообщать что запрос прямой или перенаправленный, Вы не можете использовать эту опцию и Вы должны использовать один из других путей запуска версии CGI, документированной здесь. Вариант 3: установка doc_root или user_dirРазмещение активного содержания, такого как скрипты и модули, в каталогах документов веб-сервера иногда является небезопасной практикой. Если при некоторой ошибке конфигурации сценарии не выполняются, они отображаются как обычные HTML документы, что может закончиться утечкой интеллектуальной собственности или информации безопасности подобно паролям. Поэтому многие сисадмины предпочитают устанавливать другие каталоги для сценариев, которые будут доступны только через PHP CGI и, следовательно, всегда проинтерпретированы и не отображены как таковые. Также, если недоступен метод перенаправления неуверенных запросов, как описано в предыдущем разделе, необходимо установить корневой каталог(doc_root) сценариев, который отличается от корневого каталога веб-документов. Вы можете установить корневой каталог для скриптов директивой конфигурации doc_root в файле php3.ini , или вы можете установить переменную окружения PHP_DOCUMENT_ROOT. Если это установлено, CGI-версия PHP всегда будет добавлять doc_root и путь к файлу в запросах, так что вы всегда будете уверенны что за пределами этого каталога скрипты выполняться не будут (кроме user_dir //см.ниже). Другая используемая опция - user_dir. Когда user_dir - не установлена, открытием файла управляет только doc_root. Открытие URL подобно http://my.host/~user/doc.php3 не даст результата при открытии файла из каталога пользователя, но вызывается файл ~user/doc.php3 из каталога doc_root (да,имя каталога начинается с тильды [~]). Если user_dir установлена, например как public_php, запрос, подобный http://my.host/~user/doc.php3 откроет файл doc.php3 в каталоге public_php домашнего каталога пользователя. Если это /home/user, то выполняется /home/user/public_php/doc.php3. user_dir задается независимо от doc_root, так что вы можете контролировать доступ к document root и user directory отдельно. Вариант 4: PHP синтаксический анализатор вне дерева webОчень безопасная опция должна установить синтаксический анализатор PHP где-нибудь вне дерева файлов web. В /usr/local/bin, например. Обратная сторона этой опции заключается в том что вы должны вставлять строку подобно: #!/usr/local/bin/php Чтобы PHP получил возможность корректно оперировать с PATH_INFO и PATH_TRANSLATEDпри такой установке, php анализатордолжен быть скомпилирован с опцией конфигурации --enable-discard-path Модуль ApacheКогда PHP используется как Apache модуль, не наследуются права пользователя Apache (обычно таковые - "nobody"). VI. Функции Даты/Времениcheckdatecheckdate -- проверяет правильность даты/времени Описаниеint checkdate (int month, int day, int year);Возвращает true если данная дата правильна, иначе false. Проверяет правильность даты, заданной аргументами. Дата считается правильной, если:
datedate -- формат локального времени/даты
Описаниеstring date (string format, int timestamp);Возвращает строку, отформатированную согласно данной строке и используя данную временную метку или текущее локальное время, если не задана временная метка. В фоматной строке должны использоваться следующие символы:
Функции date() и mktime() возможно использовать вместе для того, чтобы найти даты в будущем или прошлом.
Для того, чтобы отформатировать даты на других языках, Вы должны использовать функции setlocale() и strftime() strftimestrftime -- форматирует локальное время согласно установкам locale
Описаниеstring strftime (string format, int timestamp);Возвращает строку, отформатированную согласно данной форматной строке и используя данную временную метку или текущее локальное время, если метка не задана. Названия месяцев и недель и другие, зависящие от языка строки, зависят от текущего locale, устанавливающегося с помощью setlocale(). В форматной строке следует использовать следующие спецификаторы преобразований:
См.также setlocale() и mktime(). getdategetdate -- получает информацию о дате/времени Описаниеarray getdate (int timestamp);Возвращает ассоциативный массив, содержащий информацию о дате со следующими элементами:
gmdategmdate -- форматирует GMT/CUT время/дату Описаниеstring gmdate (string format, int timestamp);Аналогична функции date() за исключением того, что время возвращается в Гринвичском формате Greenwich Mean Time (GMT). Например, при запуске в Финляндии (GMT +0200), первая строка ниже напечатает "Jan 01 1998 00:00:00", в то время как вторая строка напечатает "Dec 31 1997 22:00:00".
См.также date(), mktime() и gmmktime(). mktimemktime -- получает временную метку UNIX для даты Описаниеint mktime (int hour, int minute, int second, int month, int day, int year);Предупреждение: Обратите внимание на необычный порядок аргументов, который отличается от порядка аргументов в вызове функции mktime() из UNIX, и который нехорошо ведет себя при неправильно заданных параметрах (см.ниже). Это очень часто встречающаяся ошибка в скриптах. Возвращает временную метку Unix согласно данным аргументам. Эта временная метка является целым числом, равным количеству секунд между эпохой Unix (1 Января 1970) и указанным временем. Аргументы могут быть опущены с права налево; каждый опущенный таким образом аргумент будет установлен в текущую величину согласно локальной дате и времени. MkTime is useful for doing date arithmetic and validation, as it MkTime полезена при арифметических дейтсвиях с датой и ее проверкой, она будет автоматически вычислять корректную величину для вешедших за границы параметров. Например, каждая из следующих строк возвращает строку "Jan-01-1998".
gmmktimegmmktime -- получает временную метку UNIX для даты в GMT Описаниеint gmmktime (int hour, int minute, int second, int month, int day, int year);Идентична mktime() за исключением передаваемых параметров, представляющих дату в GMT. timetime -- возвращает текущую временную метку UNIX Описаниеint time (void);Возвращает текущее время, измеренное в числе секунд с эпохи Unix (1 Января 1970 00:00:00 GMT). См.также date(). microtimemicrotime -- возвращает текущую временную метку UNIX в микросекундах Описаниеstring microtime (void);Возвращает строку "msec sec" где sec текущее время, измеренное в числе секунд с эпохи Unix (0:00:00 1 Января, 1970 GMT), а msec - это часть в микросекундах. Эти функции доступны только в операционных системах, поддерживающих системный вызов gettimeofday(). См.также time(). Часть 6. Элементы языка.Любой скрипт PHP состоит из последовательности операторов. Оператор может быть присваиванием, вызовом функции, циклом, условным выражением или пустым выражением (ничего не делающим). Операторы обычно заканчиваются точкой с запятой. Также операторы могут быть объединены в группу заключением группы операторов в фигурные скобки. Группа операторов также является оператором. В этой части описаны различные типы операторов. КонстантаPHP определяет несколько констант и предоставляет механизм для определения Ваших констант. Константы похожи на переменные, но они имеют слегка изменённый синтаксис. Предопределённые константы - это __FILE__ and __LINE__, которые соответствуют имени файла и номеру строки, которая выполняется в настоящий момент.
Вы можете определить дополнительные константы с помощью функций define() и undefine() .
ВыраженияВыражения - это краеугольный камень PHP. В PHP почти всё является выражениями. Простейший и наиболее точный способ определить выражение - это "что-то, имеющее значение". Простейший пример, приходящий на ум это константы и переменные. Когда вы печатаете "$a = 5", вы присваиваете значение '5' переменной $a. '5', очевидно, имеет значение 5, иными словами'5' это выражение со значением5 (в данном случае'5' это целочисленная константа). После этого присваивания вы считаете значением $a 5, также, если вы напишете $b = $a, вы будете ожидать того же как, если бы вы написали $b = 5. Другими словами, $a это также выражение со значением 5. Если всё написано правильно, то именно так оно и случиться. Несколько более сложные примеры выражений - это функции. К примеру, подумайте на следующей функцией : function foo () { return 5; } Подразумевая, что вы знакомы с концепциями функции (если нет, взгляните на часть, посвящённую функциям), вы считаете, что $c = foo() это практически то же самое, что написать $c = 5 и вы правы. Функции - это выражения с тем значением, которое они возвращают. Так как foo() возвращает 5, значение выражение 'foo()' - 5. Обычно функции подсчитывают возвращаемое значение,а не возвращают постоянное значение. Конечно, значения в PHP не обязаны быть целыми и зачастую они не являются таковыми. PHP поддерживает 3 скалярных типа значений : целое, число с плавающей точкой и строки ( скалярные выражения вы не можете "разбить" на более маленькие части, как, к примеру, массивы). PHP поддерживает 2 составных (нескалярных) типа : массивы и объекты. Каждое из таких значений может быть присвоено переменной или возвращено функцией. Итак, пользователи PHP/FI 2 не должны почувствовать каких-то перемен. PHP это язык, ориентированный на выражения, практически всё является выражениями.Обратимся к примеру, с которым мы уже разобрались, '$a = 5'. Легко заметить, что тут задействованы два значения - значение целой константы 5 и значение $a, которое также становиться равным 5.На самом деле здесь присутствует ещё одно значение, значение самого присваивания. Само присваивание становиться равным присваиваемому значению, в данном случае - 5.На практике это означает, что '$a = 5', не обращая внимания на то, что оно равно выражению со значением 5. То есть, запись типа '$b = ($a = 5)' похожа на запись'$a = 5; $b = 5;' (точка с запятой отмечает конец выражения). Так как присваивания рассматриваются справа налево, вы также можете написать '$b = $a = 5'. Другой хороший пример направления выражения это прежварительное и последующее увеличение и уменьшение. Рользователи PHP/FI 2 и многих других языков могут быть знакомы с записями variable++ and variable--. Это операторы увеличения и уменьшения. В PHP/FI 2, оператор '$a++' не имеет значения(не является выражением), поэтому вы не можете его присвоить или использовать как-либо иначе. PHP расширяет возможность увеличения/уменьшения делая его выражением, как и в C. В PHP, подобно C, есть 2 типа инкремента - предварительный и последующий. И предыдущий и последующий инкремент увеличивает значение переменной и воздействие на переменную идентично.Разница в значении выражения инкремента. Предыдущее увеличение, которое записывается как '++$variable', приравнивается увеличенной переменной (PHP увеличивает переменную до того, как прочитать её значение). Post-increment, which is written '$variable++' evaluates to the original value of $variable, before it was incremented (PHP increments the variable after reading its value, thus the name 'post-increment'). Очень распространённый тип выражений это выражения сравнения. Эти выражения имеют значение 0 или 1 (означает ложь или истину соответственно). PHP поддерживает > (больше, чем), >= ( больше или равно), = (равно), < (меньше,чем) и <= (меньше или равно). Эти выражения в основном используются внутри условий, например оператора IF. Последний пример выражений, с которыми мы разберёмся, это совмещённые выражения оператор-присваивание. Вы уже знаете, что для того, чтобы увеличить значение $a на еденицу, вы можете написать '$a++' или '++$a'. Но если следует увеличить значение больше, чем на еденицу, к примеру - на 3? Вы можете написать '$a++' несколько раз, но это не очень удобно и эффективно. Намного больше распространено написание '$a = $a + 3'. '$a + 3' вычисляется, как значение $a плюс 3, а затем присваивается переменной $a, в результате чего значение $a увеличивается на 3. В PHP, также как и в ряде других языков типа C, вы можете записать это короче, что со временем бывает проще и быстрее также и для понимания. Добавление 3 к текущему значению $a может быть записано как '$a+=3'. Это значит следующее : 'возьми значение $a, добавь к нему 3 и присвой это обратно $a. Кроме того, что это быстрее и понятнее, такой тип выражений быстрее исполняется. Значение '$a+=3' как и значение обычного присваивания это присвоенное значение. Заметьте, что оно не равно 3, а является общим значением $a и 3. Любой бинарный (имеющий 2 операнда - прим. пер.) оператор может быть записан таким методом, например : '$a-=5' (вычесть 5 из значения $a), '$b*=7' (умножиить значение $a на 7) и так далее. Есть ещё такое выражение, которое может показаться незнакомым, если вы не встречались с ним в других языках - условный оператор с тремя операндами : $first ? $second : $third Если значение первого выражения истинно (не равно 0), то испольняется второе выражение и это является результатом данного условного выражения. Иначе исполняется третий оператор. Этот пример должен помочь Вам лучше понять предварительное и последующее увеличение и вообще выражения ? function double($i) /* функция удваивания переменной */ В начале главы мы сказали, что объясним различные типы операторов и, как и было обещано выражения могут быть операторами. Впрочем, не каждое выражения является оператором. В данном случае оператор имеет форму 'выражение' ';', то есть выражение, за которым следует точка с запятой. В '$b=$a=5;' $a=5 это правильное выражение, но само по себе оно не является оператором. А вот '$b=$a=5;' является правильным оператором. Ещё одна вещь, которую нужно упомянуть - это логические значения выражений. Во многих случаях, в основном в условных операторах и операторах циклов, вы не заинтересованы в конкретных значениях выражений, а только являются ли их значения TRUE или FALSE (в PHP нет специального типа boolean). Логические значения вычисляются примерно так же, как я в языке Perl. Любое не нулевое целое значение - это TRUE, ноль - это FALSE. Обратите внимание на то, что отрицательные значения - это не ноль и поэтому они считаются равными TRUE. Пустая строка и строка '0' это FALSE; все остальные строки - TRUE. И насчёт составных типов (массивы и объекты) - если значение такого типа не содержит элементов, то оно считается равным FALSE; иначе подразумевается TRUE. PHP предоставляет полную и мощную реализацию выражений и подробное её описание выходит за пределы этого руководства. Приведённые выше примеры показали вам, что такое выражения и как вы можете построить реальные выражения. В остальной части руководства мы будем писать 'expr' для обозначения любого правильного выражения PHP. IFСтруктура IF это одна из важнейших возможностей многих языков, включая PHP. Она позволяет организовать выполнение фрагментов кода по условию. Возможности PHP по использованию выражения IF похожи на C: if (expr) statement Как объяснялось в части про выражения, вычисляется логический результат "expr" . Если expr равно TRUE, то PHP выполнит "statement", а если FALSE - проигнорирует. Следующий пример выведет фразу 'a is bigger than b' если $a больше $b: if ($a > $b) print "a is bigger than b"; Зачастую Вам требуется исполнить больше чем одно выражение по условию. Конечно, не надо окружать каждое выражение конструкцией IF. Вместо этого вы можете сгруппировать несколько выражений в блок выражений. К примеру, слежующий код не только выведет фразу, но и присвоит значение $a переменной $b: if ($a > $b) { print "a is bigger than b"; $b = $a; } Выражение IF может иметь неограниченную степень вложенности в другие выражения IF, что позволяет Вам эффективно использовать выполнение по условию различных частей программы. ELSEЗачастую Вам требуется исполнить одно выражение, если соблюдается какое-либо условие и другое выражение в противном случае. Вот для этого применияется ELSE. ELSE расширяет возможности IF по части обработки вариантов выражения, когда оно равно FALSE. Данный пример выведет фразу 'a is bigger than b' если $a больше $b, и 'a is NOT bigger than b' в противном случае: if ($a > $b) { print "a is bigger than b"; } else { print "a is NOT bigger than b"; } Выражение ELSE выполняется только если выражение IF равно FALSE, а если есть конструкции ELSEIF - то если и они также равны FALSE (см. ниже). ELSEIFELSEIF, как и следует из его названия, является комбинацией IF и ELSE. ELSEIF как и ELSE позволяет выполнить выражение, если значение IF равно FALSE, но в отличие от ELSE оно выполнится только если выражение ELSEIF равно TRUE.К примеру, следующий код выведет 'a is bigger than b' если$a>$b, 'a is equal to b' если $a==$b, и 'a is smaller than b' если$a<$b: if ($a > $b) { print "a is bigger than b"; } elseif ($a == $b) { print "a is equal to b"; } else { print "a is smaller than b"; } Внутри одного выражения IF может быть несколько ELSEIF. Первое выражение ELSEIF (если таковые есть), которое будет равно TRUE, будет выполнено. В PHP3 вы можете написать 'else if' (два слова), что будет значить то же самое, что и 'elseif' (одно слово). Выражение ELSEIF будет выполнено только если выражение IF и все предыдущие ELSEIF равно FALSE, а данный ELSEIF равен TRUE. Иной синтаксис для оператора IF : IF(): ... ENDIF;PHP3 предлагает иной путь для группирования операторов с оператором IF. Наиболее часто это используется когда вы внедряете блоки HTML внутрь оператора IF, но вообще может использоваться где угодно. Вместо использования фигурных скобок за "IF(выражение)" должно следовать двоеточие, одно или несколько выражений и завершающий ENDIF. Рассмотрите слежующий пример : <?php if ($a==5): ?> A = 5 <?php endif; ?> В этом примере блок "A = 5" внедрён внутрь выражения IF, используемого альтернативным способом. Блок HTML будет виден только если $a равно 5.statement written in the alternative syntax. Этот альтернативный синтаксис применим и к ELSE и ELSEIF (expr) .Вот пример подобной структуры : if ($a == 5): print "a equals 5"; print "..."; elseif ($a == 6): print "a equals 6"; print "!!!"; else: print "a is neither 5 nor 6"; endif; WHILEЦикл WHILE - простейший тип цикла в PHP3. Он действует как и его аналог в C. Основная форма оператора WHILE : WHILE(expr) statement Смысл оператора WHILE прост. Он предписывает PHP выполнять вложенный(е) оператор(ы) до тех пор пока expr равно TRUE. Значение выражения проверяется каждый раз при начале цикла, так что если значение выражения изменится внутри цикла, то он не прервётся до конца текущей итерации (выполнение всего блока вложенных операторов - это одна итерация). Иногда, если значение expr равно FALSE с самого начала, цикл не выполняется ни разу. Как и в IF, вы можете сгруппировать несколько операторов внутри фигурных скобок или использовать альтернативный синтаксис : WHILE(expr): выражения ... ENDWHILE; Следующие примеры идентичны - оба выводят номера с 1 по 10: /* example 1 */ $i = 1; while ($i <= 10) { print $i++; } /* example 2 */ $i = 1; while ($i <= 10): print $i; $i++; endwhile; DO..WHILEЦикл DO..WHILE очень похож на WHILE за исключением того, что значение логического выражения проверяется не до, а после окончания итерации. Основное отличие в том, что DO..WHILE гарантировано выполнится хотя бы один раз, что в случае WHILE не обязательно. Для циклов DO..WHILE существует только один вид синтаксиса: $i = 0; do { print $i; } while ($i>0); Этот цикл выполнится один раз, так как после окончания итерации будет проверено значение логического выражения, а оно равно FALSE ($i не больше 0), и выполнение цикла завершится. Опытные программисты на C может быть знакомы с иным использованием DO..WHILE, позволяющем прекратить исполнение блока операторов в середине путём внедрения его в цикл DO..WHILE(0) и использования оператора BREAK. Следующий код демонстрирует такую возможность : do { if ($i < 5) { print "i is not big enough"; break; } $i *= $factor; if ($i < $minimum_limit) { break; } print "i is ok"; ...process i... } while(0); Не беспокойтесь, если вы не совсем поняли это. Вы можете программировать весьма мощные скрипты и без этой возможности. FORЦиклы FOR - наиболее мощные циклы в PHP. Они работают подобно их аналогам в C. Синтаксис цикла FOR : FOR (expr1; expr2; expr3) statement Первое выражение (expr1) безусловно вычисляется(выполняется) в начале цикла. В начале каждой итерации вычисляется expr2. Если оно равно TRUE, то цикл продолжается и выполняются вложенный(е) оператор(ы). Если оно равно FALSE, то цикл заканчивается. В конце каждой итерации вычисляется(исполняется) expr3. Каждое из этих выражений может быть пустым. Если expr2 пусто, то цикл продолжается бесконечно (PHP по умолчанию считает его равным TRUE, как и С). Это не так бесполезно, как могло бы показаться, так как зачастую вам требуется закончить выполнение цикла используя оператор BREAK в сочетании с логическим условием вместо использования логического выражения в FOR. Рассмотрим следующие примеры. Все они выводят номера с 1 по 10 : /* пример 1 */ for ($i = 1; $i <= 10; $i++) { print $i; } /* пример 2 */ for ($i = 1;;$i++) { if ($i > 10) { break; } print $i; } /* пример 3 */ $i = 1; for (;;) { if ($i > 10) { break; } print $i; $i++; } /* пример 4 */ for ($i = 1; $i <= 10; print $i, $i++) ; Конечно, первый вариант кажется лучшим (или четвёртый), но оказывавется возможность использования пустых выражений в цикле FOR зачастую оказывается полезной. PHP также поддерживает альтернативный синтаксис FOR : FOR (expr1; expr2; expr3): выражение; ...; endfor; Другие языки используют оператор foreach для того, чтобы обрабатывает массивы или списки. PHP использует для этого оператор while и функции list() и each() . Для примера смотрите документацию по этим функциям. BREAKVREAK прерывает выполнение текущего цикла. $i = 0; while ($i < 10) { if ($arr[$i] == "stop") { break; } $i++; } CONTINUECONTINUE переходит на начало ближайшего цикла. while (list($key,$value) = each($arr)) { if ($key % 2) { // skip even members continue; } do_something_odd ($value); } SWITCHОператор SWITCH похож на группу операторов IF с одинаковым выражением. Во многих случаях вам нужно сравнить переменную (или выражение) со многими различными значениями и выполнить различные фрагменты кода в зависимости от того, чему будет равно значение выражения. Это как раз то, для чего предназначается оператор SWITCH. Следующие 2 примера это 2 разлчиных пути для достижения одной вещи, но один использует серию операторов IF, а другой - оператор SWITCH. /* пример 1 */ if ($i == 0) { print "i equals 0"; } if ($i == 1) { print "i equals 1"; } if ($i == 2) { print "i equals 2"; } /* пример 2 */ switch ($i) { case 0: print "i equals 0"; break; case 1: print "i equals 1"; break; case 2: print "i equals 2"; break; } Важно понять как работает оператор SWITCH чтобы избежать ошибок. SWITCH выполняет последовательно оператор за оператором. В начале код не исполняется. Только когда встречается оператор CASE с подходящим значением, PHP начинает выполнять программу. PHP продолжает выполнять операторы до конца блока SWITCH или пока не встретит оператор BREAK. Если вы не напишете BREAK в конце цикла операторов, то PHP продолжит выполнять операторы и следующего SWITCH'а. К примеру : /* пример 3 */ switch ($i) { case 0: print "i equals 0"; case 1: print "i equals 1"; case 2: print "i equals 2"; } В этом случае, если $i равно 0, то PHP выполнит все операторы print! Если $i равно 1, то PHP выполнит последние два print. И только если $i равно 2, вы получите ожидаемый результат и выведено будет только 'i equals 2'. Так что важно не забывать ставить BREAK (разве что в некоторых случаях вы специально не захотите их ставить для достижения определённой цели). Специальный случай - это 'default case'. Этот оператор соответствует всем значениям, которые не удовлетворяют другим case'ам. К примеру : /* example 4 */ switch ($i) { case 0: print "i equals 0"; break; case 1: print "i equals 1"; break; case 2: print "i equals 2"; break; default: print "i is not equal to 0, 1 or 2"; } Другой заслуживающий упоминания факт - это то, что выражения в CASE могут быть любого скалярного типа, то есть целые числа или числа с плавающей запятой, а так же строки. Массивы и объекты не будут ошибкой, но в данном случае они не имеют значимости. REQUIREОператор REQUIRE заменяет себя содержимым указанного файла, похоже на то,как в препроцессоре C работает #include. Это означает, что вы не можете поместить require() внутрь цикла и ожидать, что он включит содержимое дугого файла несколько раз в процессе каждой итерации. Для это используйте INCLUDE. require ('header.inc'); INCLUDEОператор INCLUDE вставляет и выполняет содержимое указанного файла. Это случается каждый раз, когда встречается оператор INCLUDE, так что вы можете включить этот оператор внутрь цикла, чтобы включить несколько файлов : $files = array ('first.inc', 'second.inc', 'third.inc'); for ($i = 0; $i < count($files); $i++) { include($files[$i]); } include() отличается от require() тем, что оператор include выполняется каждый раз при его встрече, а require() заменяется на содержимое указанного файла безотносительно будет ли выполнено его содержимое или нет Так как include() это специальный оператор, требуется заключать его в фигурные скобки при использовании внутри условного оператора. /* Это неправильно и не будет работать, как хотелось бы. */ if ($condition) include($file); else include($other); /* А вот это - верно. */ if ($condition) { include($file); } else { include($other); } Когда файл исполняется, парсер пребывает в "режиме HTML", то есть будет выводить содержимое файла, пока не встретит первый стартовый тег PHP (<?). Также смотрите readfile(), virtual(). FUNCTIONФункция может быть объявлена следующим образом: function foo ($arg_1, $arg_2, ..., $arg_n) { echo "Example function.\n"; return $retval; } Внутри функции может быть любой верный код PHP3, даже объявление другой функции или класса . Функции должны быть определены перед тем, как на них ссылаться. Возвращение результатовРезультаты возвращаются через необязательный оператор return. Возвращаемый результат может быть любого типа, включая списки и объекты. function my_sqrt ($num) { return $num * $num; } echo my_sqrt (4); // outputs '16'. Множественные результаты не могут быть возврашены в качестве результата, но вы можете реализовать это путём возврата списка : function foo() { return array (0, 1, 2); } list ($zero, $one, $two) = foo(); АргументыИнформация может быть передана функции через список аргументов, которые являются разделённым запятыми списком переменных и/или констант. PHP3 поддерживает передачу аргументов по значению (по умолчанию), по ссылке, и значения по умолчанию. Списки аргументов переменной длины не поддерживаются, но того же можно достичь, передавая массивы. function takes_array($input) { echo "$input[0] + $input[1] = ", $input[0]+$input[1]; } Передача по ссылкеПо умолчанию, аргменты функции передаются по значению. Если вы хотите в функции модифицировать аргументы, то можете передать их по ссылке. Если вы хотите, чтобы аргумент всегда передавался по ссылке, то следует поставить амперсенд (&) перед именем аргумента в объявлении функции : function foo( &$bar ) { $bar .= ' and something extra.'; } $str = 'This is a string, '; foo ($str); echo $str; // выведет : 'This is a string, and something extra.' Если вы хотите передать аргумент по ссылке в случае, когда по умолчанию такого не делается, то добавьте амперсенд перед именем аргумента в вызове функции : function foo ($bar) { $bar .= ' and something extra.'; } $str = 'This is a string, '; foo ($str); echo $str; // выведет 'This is a string, ' foo (&$str); echo $str; // выведет 'This is a string, and something extra.' Значения по умолчаниюФункции могут определять значения по умолчанию для скалярных аргументов в стиле C++ как показано : function makecoffee ($type = "cappucino") { echo "Making a cup of $type.\n"; } echo makecoffee (); echo makecoffee ("espresso"); Этот пример выведет следующее : Making a cup of cappucino. Making a cup of espresso. Значение по умолчанию должно быть константой, а не переменной или, к примеру, членом класса. Учтите, что когда вы объявляете аргументы по умолчанию, они должны быть справа от всех "неумолчальных" аргументов, в противном случае это не будет работать, как задумано. К примеру : function makeyogurt ($type = "acidophilus", $flavour) { return "Making a bowl of $type $flavour.\n"; } echo makeyogurt ("raspberry"); // не будет работать, как ожидалось Этот пример выведет следующее : Warning: Missing argument 2 in call to makeyogurt() in /usr/local/etc/httpd/htdocs/php3test/functest.html on line 41 Making a bowl of raspberry . А теперь сравните с этим : function makeyogurt ($flavour, $type = "acidophilus") { return "Making a bowl of $type $flavour.\n"; } echo makeyogurt ("raspberry"); // а вот это работает И выводит следующее : Making a bowl of acidophilus raspberry. OLD_FUNCTIONОператор OLD_FUNCTION позволяет вам определяить функцию использую синтаксис PHP/FI2 (за исключением того, что вы должны заменить 'function' на 'old_function'). Это свойство только для совместимости и должно использоваться лишь конверторами PHP/FI2 -> PHP3. Описанные таким образом функции не могут быть вызваны из служебного кода PHP. Это к тому же значит, что вы не можете использовать их в функциях типа usort(), array_walk() и register_shutdown_function(). Вы можете обойти это путём введения специальной функции в терминах PHP3, которая будет вызывать OLD_FUNCTION. CLASSКласс - это набор переменных и функций, работающих с этими переменными. Класс определяется следующим образом : <?php class 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; } } } ?> Это определения класса Cart, который состоит связного списка наименований товаров в корзине и двух функций для добавления и удаления вещей из корзины. Классы это типы, то есть, заготовки для реальных переменных. Вы должны создавать переменные желаемого типа, используя оператор new : $cart = new Cart; $cart->add_item("10", 1); Таким образом, мы создали объект $cart класса Cart. Функция add_item() этого объекта вызывается для добавления 1 товара номер 10 к корзине. Классы могут быть расширениями других классов. Расширенный класс обладает всеми переменными и функциями базового класса и тем, что вы определите при расширении класса. Это делается используя ключевое слово 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); // (унаследовано из обычной корзины) Внутри функций класса переменная $this означает сам объект. Вы должны использовать $this->нечто для доступа к переменной или функции с именем 'нечто' внутри объекта. Конструкторы это функции в классе, которые автоматически вызываются, когда вы создаёте новую переменную данного класса. Функция становится классом, когда она имеет такое же имя, как и сам класс. class Auto_Cart extends Cart { function Auto_Cart () { $this->add_item ("10", 1); } } Мы определили класс Auto_Cart который является тем же классом Cart плюс имеет конструктор, который инициализирует корзину при создании, наполняя её одним товаром типа "10". Конструкторы также могут иметь аргументы, и эти аргументы могут быть необязательными, что делает конструктор более полезным : class Constructor_Cart { function Constructor_Cart ($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Покупаем вся одно и то же : XVII. Функции IMAP Содержание imap_append imap_base64 imap_body imap_check imap_close imap_createmailbox imap_delete imap_deletemailbox imap_expunge imap_fetchbody imap_fetchstructure imap_header imap_headers imap_listmailbox imap_listsubscribed imap_mail_copy imap_mail_move imap_num_msg imap_num_recent imap_open imap_ping imap_renamemailbox imap_reopen imap_subscribe imap_undelete imap_unsubscribe imap_qprint imap_8bit imap_binary imap_scanmailbox imap_mailboxmsginfo imap_rfc822_write_address imap_rfc822_parse_adrlist imap_setflag_full imap_clearflag_full imap_sort imap_fetchheader imap_uid Для того, чтобы эти функции заработали вц должны скомпилировать PHP с флагом --with-imap. Этот флаг требут, чтобы была установлена библиотека c-client. Последнюю версию можно получить по адресу ftp://ftp.cac.washington.edu/imap/. Затем скопируйте c-client/c-client.a в /usr/local/lib или какую либо другую директорию, прописанную в пути, затем скопируйте c-client/rfc822.h, mail.h и linkage.h в /usr/local/include или другую директорию с include-файлами. imap_append imap_append -- Добавляет текстовое сообщение в указанный почтовый ящик Описание int imap_append(int imap_stream, string mbox, string message, stringflags); Возвращает true в случае успеха или false иначе. imap_append() добавляет текстовое сообщение в указанный почтовый ящик mbox. Если указаны необязательные флаги, также записывает в почтовый ящик и флаги. При общении с сервером Cyrus IMAP нужно использовать в качестве ограничителей строки "\r\n" вместо "\n", иначе действие не выполнится. imap_base64 imap_base64 -- Декодирует текст, закодированный с помощью BASE64 Описание string imap_base64(string text); Функция imap_base64() декодирует текст в формате BASE-64. Декодированное сообщение возвращается как строка. imap_body imap_body -- Читает тело сообщения Описание string imap_body(int imap_stream, int msg_number, int flags); Функция imap_body() возвращает тело сообщения, имеющего номер п/п msg_number в текущем почтовом ящике. Необязательные флаги это битовые маски из FT_UID - Номер сообщения msgno является UID'ом сообщения FT_PEEK - Не устанавливать флаг \Seen если он еще не установлен. FT_INTERNAL - Возвращаемая строка записана во внутреннем формате и не может быть приведена к канонической форме с CRLF. imap_check imap_check -- Проверяет текущий почтовый ящик Описание array imap_check(int imap_stream); Возвращает информацию о текущем почтовом ящике. В случае неуспеха возвращает FALSE. Функция imap_check() проверяет статус текущего почтового ящика на сервере и возвращает информацию в объекте со следующими свойствами. Date : дата сообщения Driver : драйвер Mailbox : название почтового ящика Nmsgs : количество сообщений Recent : количество недавно пришедших сообщений imap_close imap_close -- Закрывает поток IMAP Описание int imap_close(int imap_stream, int flags); Закрывает поток imap. Необязательный флаг CL_EXPUNGE заставляет стереть помеченные на удаление сообщения при закрытии. imap_createmailbox imap_createmailbox -- Создает новый почтовый ящик. Описание int imap_createmailbox(int imap_stream, string mbox); imap_createmailbox() создает новый почтовый ящик указанный в mbox. Возвращает true в случае успеха и false при ошибке. imap_delete imap_delete -- Помечает сообщение из текущего почтового ящика на удаление Описание int imap_delete(int imap_stream, int msg_number); Возвращает true. Функция imap_delete() помечает сообщение, указанное через msg_number на удаление. Настоящее удаление сообщений осуществляется функцией imap_expunge(). imap_deletemailbox imap_deletemailbox -- Удаляет почтовый ящик Описание int imap_deletemailbox(int imap_stream, string mbox); imap_deletemailbox() удаляет указанный почтовый ящик. Возвращает true в случае успеха и false иначе. imap_expunge imap_expunge -- Удаляет все сообщения, помеченные на удаление Описание int imap_expunge(int imap_stream); imap_expunge() удаляет все сообщения помеченные на удаление с помощью imap_delete(). Возвращает true. imap_fetchbody imap_fetchbody -- Извлекает простую секцию тела сообщения Описание string imap_fetchbody(int imap_stream, int msg_number, int part_number, flags flags); Эта функция заставляет извлечь подробную секцию указанного сообщения как текстовую строку. Секция это строка целых чисел, разделенных точками, которые указывают на части тела сообщения в списке частей согласно спецификации IMAP4. Части тела не декодируются этой функцией. Необязательным параметром к imap_fetchbody () является битовая маска из FT_UID - msgono является UID'ом FT_PEEK - не устанавливать флаг \Seen если он не установлен FT_UID - возвращаемая строка записана во внутреннем формате, которое не может быть канонизированна с помощью CRLF imap_fetchstructure imap_fetchstructure -- Читает структуру простого сообщения Описание array imap_fetchstructure(int imap_stream, int msg_number); Эта функция заставляет извлечь всю информацию о структуре сообщения с номером msg_number. Возвращаемая величина является объектом со следующими элементами. type, encoding, ifsubtype, subtype, ifdescription, description, ifid, id, lines, bytes, ifparameters тип, кодировка, подтип интерфейса, подтип, описание интерфейса, описание, идентификатор интерфейса, строки, байты, параметры интерфейса Также функция возвращает массив объектов под названием parameters[]. Этот объект имеет следующие свойства. attribute, value атрибут, величина В случае сообщения из нескольих частей, функция также возвращает массив объектов всех свойств под название parts[]. imap_header imap_header -- Читает заголовок сообщения Описание object imap_header(int imap_stream, int msg_number, int fromlength, int subjectlength, int defaulthost); Эта функция возвращает объект различных элементов заголовка remail,date,Date,subject,Subject,in_reply_to,message_id,newsgroups, followup_to,references toaddress (полная строка To: строка длиной до 1024 символов) to[] (возвращает массив объектов из строки To, содержит:) personal adl mailbox host fromaddress (полная строка From: строка длиной до 1024 символов) from[] (возвращает массив объектов из строки From, содержит:) personal adl mailbox host ccaddress (полная строка Cc: строка длиной до 1024 символов) cc[] (возвращает массив объектов из строки Cc, содержит:) personal adl mailbox host bccaddress (полная строка Bcc: строка длиной до 1024 символов) bcc[] (возвращает массив объектов из строки Bcc, содержит:) personal adl mailbox host reply_toaddress (полная строка Reply_to: строка длиной до 1024 символов) reply_to[] (возвращает массив объектов из строки Reply_to, содержит:) personal adl mailbox host senderaddress (полная строка Sender: строка длиной до 1024 символов) sender[] (возвращает массив объектов из строки Sender, содержит:) personal adl mailbox host return_path (полная строка Return-path: строка длиной до 1024 символов) return_path[] (возвращает массив объектов из строки Return_path, содержит:) personal adl mailbox host udate ( дата сообщения в формате времени unix) fetchfrom (строка From, отформатированная до fromlength символов) fetchsubject (строка Subject, отформатированная до subjectlength символов) imap_headers imap_headers -- Возвращает заголовки всех сообщений в почтовом ящике Описание array imap_headers(int imap_stream); Возвращает строковый массив из информации по заголокам. Один элемент массива на сообщение. imap_listmailbox imap_listmailbox -- Читает список почтовых ящиков Описание array imap_listmailbox(int imap_stream, string ref, string pat); Возвращает массив, содержащий названия почтовых ящиков. imap_listsubscribed imap_listsubscribed -- Перечисляет все подписанные ящики Описание array imap_listsubscribed(int imap_stream, string ref, string pattern); Возвращает массив всех почтовых ящиков на которые Вы подписаны. Аргументы ref и pattern указывают начальное месторасположение откуда начинать поиск и шаблон, которому должны удовлетворять названия почтовых ящиков. imap_mail_copy imap_mail_copy -- Копирует указанные сообщения в почтовый ящик Описание int imap_mail_copy(int imap_stream, string msglist, string mbox, int flags); Возвращает true в случае успеха и false иначе. Копирует почтовые сообщения указанные с помощью msglist в почтовый ящик mbox. msglist - это диапазон, а не просто номера сообщений. флаги - это битовые маски из CP_UID - номера в последовательности содержат UID'ы CP_MOVE - после копирования удалить сообщения из текущего почтового ящика imap_mail_move imap_mail_move -- Переносит указанные сообщения в почтовый ящик Описание int imap_mail_move(int imap_stream, string msglist, string mbox); Переносит почтовые сообщения указанные с помощью msglist в почтовый ящик mbox. msglist - это диапазон, а не просто номера сообщений. Возвращает true в случае успеха и false иначе. imap_num_msg imap_num_msg -- Выдает количество сообщений в текущем почтовом ящике Описание int imap_num_msg(void); Возвращает количество сообщений в текущем почтовом ящике. imap_num_recent imap_num_recent -- Возвращает количество недавно пришедших сообщений в текущем почтовом ящике Описание int imap_num_recent(int imap_stream); Возвращает количество недавно пришедших сообщений в текущем почтовом ящике. imap_open imap_open -- Открывает поток IMAP в почтовый ящик Описание int imap_open(string mailbox, string username, string password, int flags); В случае успеха возвращает поток IMAP или false иначе. Эта функция может быть использована для открытия потоков к POP3 и NNTP серверам. Для того, чтобы присоединиться к серверу IMAP на 143-й порт на локальной машине сделайте следующее: $mbox = imap_open("{localhost:143}INBOX","user_id","password"); Для того, чтобы подсоединиться к POP3-серверу на 110-й порт на локальном сервере используйте: $mbox = imap_open("{localhost/pop3:110}INBOX","user_id","password"); Для того, чтобы подсоединиться к NNTP-серверу на 119-й порт на локальном сервере используйте: $nntp = imap_open("{localhost/nntp:119}comp.test","",""); Для того, чтобы подсоединиться к удаленному серверу замените "localhost" на имя или IP-адрес сервера к которому Вы хотите подсоединиться. Опции - битовая маска из OP_READONLY - Открыть почтовый ящик в режим "только чтение" OP_ANONYMOUS - Не использовать или не обновлять .newsrc при использовании новостей OP_HALFOPEN - Для IMAP и NNTP устанавливает соединение, но не открывает почтовый ящик CL_EXPUNGE - Автоматически очищать почтовый ящик при закрытии imap_ping imap_ping -- Проверяет поток IMAP на работоспособность Описание int imap_ping(int imap_stream); Возвращает true если поток еще работоспособен и false иначе. Функция imap_ping() проверяет поток на работоспособность. Он может также проверять новую почту; это предпочтительный метод для периодической проверки новой почты и "живучести" удаленных серверов. imap_renamemailbox imap_renamemailbox -- Переименовывает старый почтовый ящик в новый Описание int imap_renamemailbox(int imap_stream, string old_mbox, string new_mbox); Эта функция переименовывает старый почтовый ящик в новый. Возвращает true в случае успеха и false иначе. imap_reopen imap_reopen -- Заново открывает поток IMAP на новый почтовый ящик Описание int imap_reopen(string imap_stream, string mailbox, string [flags]); Возвращает true в случае успеха и false иначе. Эта функция заново открывает указанный поток на новый ящик. Опции - битовая маска из OP_READONLY - Открыть почтовый ящик в режиме только чтение OP_ANONYMOUS - Не использовать или не обновлять .newsrc при работе с новостями OP_HALFOPEN - Для IMAP и NNTP устанавливает связь но не открывает почтовый ящик CL_EXPUNGE - Очищает почтовый ящик при закрытии imap_subscribe imap_subscribe -- Подписывает на почтовый ящик Описание int imap_subscribe(int imap_stream, string mbox); Подписывает на новый почтовый ящик. Возвращает true в случае успеха и false иначе. imap_undelete imap_undelete -- Снимает отметку с сообщения помеченного на удаление Описание int imap_undelete(int imap_stream, int msg_number); Эта функция cнимает отметку с сообщения помеченного на удаление функцией imap_delete(). Возвращает true в случае успеха и false иначе. imap_unsubscribe imap_unsubscribe -- Снимает подписку с почтового ящика Описание int imap_unsubscribe(int imap_stream, string mbox); Снимает подписку с почтового ящика. Возвращает true в случае успеха и false иначе. imap_qprint imap_qprint -- Конвертирует строку формата quoted-printable в 8-битовую строку Описание string imap_qprint(string string); Конвертирует строку формата quoted-printable в 8-битовую строку. Возвращает 8-битовую (бинарную) строку imap_8bit imap_8bit -- Конвертирует 8-битовую строку в формат quoted-printable Описание string imap_8bit(string string); Конвертирует 8-битовую строку в формат quoted-printable. Возвращает строку в формате quoted-printable. imap_binary imap_binary -- Конвертирует 8-битную строку в формат base64 Описание string imap_binary(string string); Конвертирует 8-битную строку в формат base64. Возвращает строку в формате base64. imap_scanmailbox imap_scanmailbox -- Читает список почтовых ящиков, проводит поиск в названиях ящиков Описание array imap_scanmailbox(int imap_stream, string string); Возвращает массив, содержащий имена почтовых ящиков, которые имеют строку string в названии. imap_mailboxmsginfo imap_mailboxmsginfo -- Получает информацию о текущем почтовом ящике Описание array imap_mailboxmsginfo(int imap_stream); Возвращает информацию о текущем почтовом ящике. FALSE в случае неудачи. Функция imap_mailboxmsginfo() проверяет статус текущего почтового ящика на сервере и возвращает информацию в объекте со следующими свойствами: Date : дата сообщения Driver : драйвер Mailbox : название почтового ящика Nmsgs : количество сообщений Recent : количество недавно пришедших сообщений Unread : количество непрочитанных сообщений Size : размер почтового ящика imap_rfc822_write_address imap_rfc822_write_address -- Возвращает правильно отформатированный email адрес Description string imap_rfc822_write_address(string mailbox, string host, string personal); Возвращает правильно отформатированный email адрес по данному почтовому ящику, хосту и персональной информации. imap_rfc822_parse_adrlist imap_rfc822_parse_adrlist -- Проводит разбор адресной строки Описание string imap_rfc822_parse_adrlist(string address, string default_host); Эта функция разбирает адресную строку и для каждого адреса возвращает массив объектов. Есть 4 типа объектов: mailbox - название почтового ящика (имя пользователя) host - название хоста personal - личное имя adl - путь к домену-источнику imap_setflag_full imap_setflag_full -- Устанавливает флаги на сообщения Описание string imap_setflag_full(int stream, string sequence, string flag, string options); Эта функция застваляет добавить указанный флаг к набору флагов сообщения в указанной последовательности. options - это битовая маска из ST_UID Аргументы последовательности содержат UIDы вместо номеров imap_clearflag_full imap_clearflag_full -- Очищает флаги сообщения Описание string imap_clearflag_full(int stream, string sequence, string flag, string options); Эта функция заставляет удалить флаги из набора флагов сообщения в указанной последовательности. options - это битовая маска из ST_UID Аргументы последовательности содержат UIDы вместо номеров imap_sort imap_sort -- Сортирует сообщения в текущем почтовом ящике Описание string imap_sort(int stream, int criteria, int reverse, int options); Возвращает массив номеров сообщений рассортированных по данному параметру Rev должен быть равен 1 если нужна сортировка в обратном порядке Критерии сортировки (должен быть указан только один): SORTDATE по дате сообщения SORTARRIVAL по дате поступления SORTFROM по полю From SORTSUBJECT по теме сообщения SORTTO по полю To SORTCC по полю cc SORTSIZE по размеру опции - битовая маска из SE_UID Возвратить UIDы вместо номеров последовательности SE_NOPREFETCH Не извелекать заранее найденные сообщения imap_fetchheader imap_fetchheader -- Возвращает заголовок сообщения Описание stringimap_fetchheader(int imap_stream, int msgno, int flags); Эта функция заставляет извлечь полный, неотфильтрованный заголовок указанного сообщения в формате RFC 822 как текстовую строку. Опиции: FT_UID msgno является UID'ом FT_INTERNAL Возвращаемая строка записана во внутреннем формате без каких-либо попыток канонизировать ее с помощью CRLF FT_PREFETCHTEXT RFC822. Текст должен быть предварительно разобран. Это поможет избежать эстренных задержек если требуется извлечь полный текст сообщения (например, в операции "сохранить в локальном файле") imap_uid imap_uid -- Эта функция возвращает UID по данному номеру сообщения в последовательности Описание string imap_uid(string mailbox, int msgno); Эта функция возвращает UID по данному номеру сообщения в последовательности.
Содержание |
Пример 1. unset() пример unset( $foo ); unset( $bar['quux'] ); |
Данные BC функции задействованы только при условии что PHP был скомпилирован в режиме --enable-bcmath, т.е. при включенных в конфигурацию bcmath функциях.
bcadd -- Сложение двух чисел произвольной точности.
string bcadd(string левый операнд, string правый операнд, int [масштаб]);
Прибавляет левый операнд к правому операнду и возвращает сумму типа string (строковая переменная). Факультативный параметр масштаб используется чтобы установить количество разрядов после десятичной отметки в результате.
Смотрите также bcsub().
bccomp -- Сравнение двух чисел произвольной точности.
int bccomp(string левый
операнд, string правый операнд, int [масштаб]);
Сравнивает левый операнд с правым операндом и возвращает результат типа integer (целое). Факультативный параметр масштаб используется для установки количества цифр после десятичной отметки, используемых при сравнении. При равенстве двух операндов возвращается значение 0. Если левый операнд больше правого операнда возврашается +1, и если левый операнд меньше правого операнда возвращается -1.
bcdiv -- Операция деления для двух чисел произвольной точности.
string bcdiv(string левый
операнд, string правый операнд, int [масштаб]);
Делит левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.
Смотрите также bcmul().
bcmod -- Получение модуля числа произвольной точности.
string bcmod
(string левый
операнд, string модуль);
Получение модуля левого операнда используя операнд модуль.
Смотрите также bcdiv().
bcmul -- Операция умножения для двух чисел произвольной точности.
string bcmul
(string левый операнд, string правый
операнд, int [масштаб]);
Умножает левый операнд на правый операнд и возвращает результат. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.
Смотрите также bcdiv().
bcpow -- Возведение одного числа произвольной точности в степень другого.
string bcpow
(string x, string y, int [масштаб]);
Возведение x в степень y. Параметр масштаб может использоваться для установки количества цифр после десятичной отметки в результате.
Смотрите также bcsqrt().
bcscale -- Устанавливает масштаб по умолчанию для всех математических BC-функций
string bcscale
(int масштаб);
Эта функция устанавливает заданный по умолчанию параметр масштаба для всех последующих математических BC-функций, которые явно не определяют параметр масштаба.
bcsqrt -- Получение квадратного корня числа произвольной точности.
string bcsqrt
(string операнд,
int масштаб);
Возвращает кваддратный корень операнда. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.
Смотрите также bcpow().
bcsub -- Вычитает одно число произвольной точности из другого.
string bcsub
(string левый
операнд, string правый операнд, int [масштаб]);
Вычитает правый операнд из левого операнда и возвращает результат типа string. Факультативный параметр масштаб устанавливает количество цифр после десятичной отметки в результате.
Смотрите также bcadd().
Имеются некоторые условия, которые надо иметь в виду при использовании eval(). Не забудьте, что переданная строка должна иметь допустимый PHP код, при включении чего-нибудь подобного завершению кода с точкой с запятой дальнейшее выполнение не прервется на строке после eval(), поэтому пропускайте это в code_str.
Также не забудьте, что при изменении переменных значений в eval()
эти переменные будут изменены и в основных данных.
Пример 1. eval() - простое объединение
текста
<?php $string = 'cup'; $name = 'coffee'; $str = 'This is a $string with my $name in it.<br>'; echo $str; eval( "\$str = \"$str\";" ); echo $str; ?> |
При выполнении вышеприведенного примера будет выведено следующее:
This is a $string with my $name in it. This is a cup with my coffee in it.
Пример 1. die
<?php $filename = '/path/to/data-file'; $file = fopen($filename, 'r') or die "unable to open file ($filename)"; ?> |
Это полезно при отладке диспетчера памяти, который автоматически очищает "отсеченную" память при выполнении запроса.
Идея на эту функцию принималась из Perl и всей работы кодов форматирования
также как там. Строка формата состоит из кодов формата, сопровождаемые
факультативным параметром ретранслятора. Параметр ретранслятора может быть
или целочисленное значение или * для повторение до конца входных данных.
Для a, A, h, H количество повторов определяет, сколько принимается символов
одного параметра данных, для @ это безусловная позиция, где поместить следующие
данные, для всего остального количество повторов определяет сколько данных
будет использовано и упаковано в возникающую в результате двоичную строку.
В настоящее время выполнено:
A строка SPACE-заполнений
h Hex строка, младший полубайт вначале
H Hex строка, старший полубайт вначале
c signed char
C unsigned char
s signed short (всегда 16 бит, machine byte order)
S unsigned short (всегда 16 бит, machine byte order)
n unsigned short (всегда 16 бит, big endian byte order)
v unsigned short (всегда 16 бит, little endian byte order)
i signed integer (machine dependant размер и byte order)
I unsigned integer (machine dependant размер и byte order)
l signed long (всегда 32 бит, machine byte order)
L unsigned long (всегда 32 бит, machine byte order)
N unsigned long (всегда 32 бит, big endian byte order)
V unsigned long (всегда 32 бит, little endian byte order)
f float (machine dependent размер и representation)
d double (machine dependent размер и representation)
x NUL байт
X Копирует один байт
@ NUL-Заполнение до конкретной позиции
Пример 1. pack форматируем строку
$binarydata = pack(" nvc* ", 0x1234, 0x5678, 65, 66);Возникающая в результате двоичная строка будет длиной 6 байтов и содержать последовательность байтов 0x12, 0x34, 0x78, 0x56, 0x41, 0x42. |
Обратите внимание, что различие между знаковыми и без знаковыми значениями эффективно только для функции unpack(), так как функция pack() дает тот же самый результат для знаковых и без знаковых кодов форматирования.
Также обратите внимание, что PHP хранит интегральные значения как значения со знаком и имеет machine dependant размер. Если вы делаете без знака, то интегральное значение будет сохранено и сконвертировано, при этом конечный результат будет неизвестен.
Это полезно для сохранения или передачи значений PHP без потери их типа и структуры..
Чтобы преобразовать строку обратно в PHP значение, используйте unserialize().
serialize()
обрабатывает следующие типы: integer, double, string, array
(многомерный) и object (объект будет
преобразован в последовательную форму, но методы при этом будут утеряны).
Пример 1. serialize
// $session_data содержит многомерный массив с информацией о сессии // текущего пользователя. Мы используем serialize() для сохранения // этого в базе данных в конце запроса. $conn = odbc_connect("webdb", "php", "chicken"); $stmt = odbc_prepare($conn, "UPDATE sessions SET data = ? WHERE id = ?"); $sqldata = array(serialize($session_data), $PHP_AUTH_USER); if (!odbc_execute($stmt, &$sqldata)) { $stmt = odbc_prepare($conn, "INSERT INTO sessions (id, data) VALUES(?, ?)"); if (!odbc_execute($stmt, &$sqldata)) { /* Что-то сделано неправильно. */ } } |
См. также usleep().
Unpack работает не так как в Perl поскольку распакованные данные сохранены
в ассоциативном массиве. Чтобы сделать это, Вы должны установить различные
коды формата, и отделить их наклонной чертой вправо /.
Пример 1. Распаковываем строку
$array = unpack("c2chars/nint", $binarydata);Возникающий в результате массив будет содержать "chars1", "chars2" и "int". |
Для объяснения кодов формата см. также: pack()
Помните, что PHP хранит интегральные значения со знаком. Даже если вы сохраните с указанием что это без знака, и будете извлекать, то все равно непредсказуем результат и может возникнуть ошибка.
Пример 1. unserialize
// Здесь мы используем unserialize() для загрузки данных о сессии из базы данных // в $session_data. Этот пример дополняет описанный в месте // с serialize(). $conn = odbc_connect("webdb", "php", "chicken"); $stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?"); $sqldata = array($PHP_AUTH_USER); if (!odbc_execute($stmt, &$sqldata) || !odbc_fetch_into($stmt, &$tmp)) { // Если сбой запуска или выборки , то инициализируем массив $session_data = array(); } else { // Мы должны иметь представление в $tmp[0]. $session_data = unserialize($tmp[0]); if (!is_array($session_data)) { // Что-то неправильно, инициализируем массив $session_data = array(); } } |
Если Вы нуждаетесь в уникальном идентификаторе или лексеме(маркере), и Вы предполагаете раздавать эту лексему(маркер) пользователю через сеть (то есть сеанс cookies), то рекомендуется, чтобы Вы использовали что - нибудь со строками
$token = md5(uniqid("")); // Не произвольно $better_token = md5(uniqid(random())); // Намного лучше, труднее подобрать
См. также sleep().
PHP 3.0 полностью изменен. Его лексический анализатор стал намного более логичным и последовательным чем 2.0; версия 3.0 быстрее, и использует меньше ресурсов. Однако, некоторые усовершенствования повлекли частичную несовместимость в синтаксисе и функциональных возможностях.
Кроме того, в PHP 3.0 улучшен синтаксис и семантика, что также повлекло некоторую несовместимость. Однако, мы надеемся, что все эти усовершенствования к лучшему.
Эта глава поможет вам решить проблемы связанные с несовместимостью при переходе от PHP/FI 2.0 к PHP 3.0. Новые возможности здесь не рассматриваются.
Существует программа, которая может автоматически конвертировать старый PHP/FI 2.0 скрипт; вы можете найти ее в подкаталоге convertor дистрибутива PHP 3.0. Эта программа только отслеживает изменения синтаксиса, поэтому, в любом случае, вам придется прочитать эту главу внимательно.
Первое, что вы вероятно заметите - это то что открывающий и закрывающий тэги PHP изменены. Старая <?> форма была заменена тремя новыми возможными формами:
Пример 0-1. Изменение: старые открывающий и закрывающий тэги:
<? echo "This is PHP/FI 2.0 code.\n"; > |
Начиная с версии 2.0, PHP/FI поддерживает также следующий формат:
Пример 0-2. Изменение: новые открывающий и закрывающий тэги, первый вариант:
<? echo "This is PHP 3.0 code!\n"; ?> |
Заметьте, что закрывающий тэг теперь состоит из знака вопроса и знака "больше" вместо только "больше". Однако, если Вы планируете использовать XML на вашем сервере, у вас будут проблемы с этим вариантом, так как PHP может попробовать исполнить разметку XML в документах XML как код PHP. Из-за этого, было внесено следующее изменение:
Пример 0-3. Изменение: новые тэги начала и конца, второй вариант:
<?php echo "This is PHP 3.0 code!\n"; ?> |
Из-за проблем с редакторами, не поддерживающими инструкции обработки (например Microsoft FrontPage), были введены следующие изменения:
Пример 0-4. Изменение: новые тэги начала и конца, третий вариант:
<script language="php"> echo "This is PHP 3.0 code!\n"; </script> |
"Альтернативный" способ описания блока if/elseif/else, с использованием, if(); elseif (); else; endif; не мог быть эффективно осуществлен без серьезного усложнения компиллятора/интерпретатора, из-за этого его синтаксис был изменен:
Пример 0-5. Изменение: старый синтаксис if..endif:
if ($foo); echo "yep\n"; elseif ($bar); echo "almost\n"; else; echo "nope\n"; endif; |
Пример 0-6. Изменение: новый синтаксис if..endif:if ($foo): echo "yep\n"; elseif ($bar): echo "almost\n"; else: echo "nope\n"; endif; |
Точки с запятой были заменены двоеточиями во всех операторах, за исключением завершающего блок (endif).
Точно так же как, с if..endif, был изменен синтаксис while..endwhile:
Пример 0-7. Изменения: старый, while..endwhile синтаксис:
while ($more_to_come); ... endwhile; |
Пример 0-8. Изменения: новый синтаксис while..endwhile:
while ($more_to_come): ... endwhile; |
Внимание! |
Используя устаревший синтаксис в PHP 3.0 вы получите бесконечный цикл. |
В PHP/FI 2.0 использовалась левая часть выражения для определения типа результата. PHP 3.0 учитывает обе части выражения для определения типа результата; это может привести к неожиданным результатам работы скриптов 2.0.
Рассмотрите этот пример:
$a[0]=5; $a[1]=7; $key = key($a); while ("" != $key) { echo "$keyn"; next($a); }
В PHP/FI 2.0 мы получили бы индексы $a. В PHP 3.0 мы не увидим ничего. Причина в том что в PHP 2.0, переменная в левой части выражения - строка; было выполнено сравнение, действительно "" не равно "0", и цикл был пройден. В PHP 3.0, при выполнении операции сравнения строковой и целочисленных переменных, строка будет преобразована в целое число и далее аргументы сравниваются как целые. Это означает в данном случае, что сравненивается значение функции atoi("") которое равно 0, и variablelist которое также равно 0; цикл не выполняется ни разу.
Исправить это достаточно просто. Замените начало на:
while ((string)$key != "") {
Сообщения об ошибках PHP 3.0, как правило, точнее чем в 2.0. Вместо указания фрагмента кода, вызвавший ошибку, вы получаете имя файла и номер строки.
В PHP 3.0 используется метод сокращенного вычисления логических выражений. Это означает что в выражении (1 || test_me()), функция test_me() не вызывается, так как результат функции уже не сможет изменить результат этого логического выражения.
Эта незначительная, на первый взгляд, проблема совместимости может приести к неожиданным последствиям.
Большинство внутренних функции были переписаны; теперь они возвращают TRUE, в случае удачи и FALSE в противном случае, тогда как в PHP/FI 2.0 возвращаются 0 и -1 соответственно. Эти новые возможности позволяют создавать более логичный код, такой так $fp = fopen("/your/file") or fail("darn!");. Так как PHP/FI 2.0 не имел четких правил, относительно того, что должна вернуть функция в случае неудачи, в большинстве случаев скрипты использующие подобные функции должны быть проверены вручную после проверки конвертером.
Пример 0-9. Изменения 2.0: возвращаемые значения, старый код:
$fp = fopen($file, "r"); if ($fp == -1); echo("Could not open $file for reading<br>\n"); endif; |
Пример 0-10. Изменения 2.0: возвращаемые значения, новый код:
$fp = @fopen($file, "r") or print("Could not open $file for reading<br>\n"); |
То есть вы не можете читать массив в цикле, выполняющем $data = $array[]. Используйте current()и next().
Кроме того, выражение $array1[] = $array2 не добавляет значения массива $array2 к $array1, но добавляет $array2 как последний элемент $array1. См. также поддерку многомерных массивов.
Пример 0-11. Изменения 2.0: сложение для строковых переменных
echo "1" + "1"; В PHP 2.0 значение этого выражения - 11, а в PHP 3.0 - 2. Используйте вместо него: echo "1"."1"; $a = 1; $b = 1; echo $a + $b; Значение этого выражения = 2 для PHP 2.0 и 3.0. $a = 1; $b = 1; echo $a.$b; Это выражение вернет 11 в PHP 3.0. |
Все функции выглядят следующим образом:
void php3_foo(INTERNAL_FUNCTION_PARAMETERS) { }
Это общий вид функции, даже если она не имеет аргументов.
Аргументы всегда имеют тип pval. Этот тип представляет собой объединение (union), в котором содержится фактический тип аргумента. В том случае, если ваша функция принимает несколько аргументов, вы можете сделать что-нибудь вроде этого в начале вашей функции:
Пример 0-1. Объявление переменных:
pval *arg1, *arg2; if (ARG_COUNT(ht) != 2 || getParameters(ht,2,&arg1,&arg2)==FAILURE) { WRONG_PARAM_COUNT; } |
Обратите внимание: аргументы могут быть по значению или по ссылке. В любом случае вы должны передать &(pval *) в getParameters. Если вы хотите проверить, был ли параметр передан ссылкой или нет, вы можете использовать функцию ParameterPassedByReference(ht,n), она вернет 1 или 0.
Если изменяете один из параметров, переданный по ссылке или по значению, вы можете вызвать pval_destructor, или, в том случае, если это массив, вы можете использолвать функцию, подобную одной из internal_functions.h, в котоых return_value является массивом.
Если вы собираетесь преобразовывать параметр к IS_STRING - сначала создайте новую строку с помощью estrdup() и укажите ее длину, только после этого преобразуйте к IS_STRING. Если вы изменяете строку параметра уже являющегося IS_STRING или IS_ARRAY, сначала придется использовать pval_destructor.
Функция может принимать неопределенное количество аргументов. Например, в случае, если ваша функция принимает два или три аргумента, можно использовать следующий код:
Пример 0-2. Функции, принимающие несколько аргументов
pval *arg1, *arg2, *arg3; int arg_count = ARG_COUNT(ht); if (arg_count < 2 || arg_count > 3 || getParameters(ht,arg_count,&arg1,&arg2,&arg3)==FAILURE) { WRONG_PARAM_COUNT; } |
Тип каждого аргумента означен в поле type структуры pval. Этот тип может быть любым из приведенных ниже:
Таблица 0-1. Типы переменных PHP
IS_STRING | String |
IS_DOUBLE | Double-precision floating point |
IS_LONG | Long integer |
IS_ARRAY | Array |
IS_EMPTY | None |
IS_USER_FUNCTION | ?? |
IS_INTERNAL_FUNCTION | ?? (если не может быть передана в функцию - удаляется) |
IS_CLASS | ?? |
IS_OBJECT | ?? |
Если вы получаете аргумент одного типа и хотели бы использовать его как аргумент другого типа, или если вы хотите жестко определить тип аргумента - используйте одну из преобразующих функций:
convert_to_long(arg1); convert_to_double(arg1); convert_to_string(arg1); convert_to_boolean_long(arg1); /* Если строка равна "" или "0" возвращает 0, во всех иных случаях 1 */ convert_string_to_number(arg1); /* Преобразует строку к LONG или DOUBLE в зависимости от содержания */
Эти функции только выполняют преобразование аргумента, они не возвращают значений.
Тип переменной обозначается в объединении:
Память, необходимая внутри функции, должна быть зарезервирована функциями emalloc() или estrdup(). Это функции управления памятью, которые выглядят и работают как обычные malloc() и strdup(). Память освобождается с помощью efree().
В программе могут быть использованы два вида памяти: область памяти, которая будет использована переменными, и временная память для функций. Когда вы присваиваете строковое значение переменной первого типа, вы должны предварительно выделить область памяти при помощи emalloc() or estrdup(). Вы НЕ должны освобождать эту память, если только вы не переписываете знаение переменной в той же функции (это считается не очень хорошим стилем программирования).
Для работы с временной/постоянной памятью необходимо использовать три функции: emalloc(), estrdup(), и efree(). Они работают ТАКЖЕ как их "двойники". Память, выделенную с помощью emalloc() или estrdup() вы должны освободить с помощью efree(), иначе область памяти будет утеряна. Под словами "также, как двойники" мы имеем в виду следующее: если вы пытаетесь освободить память, которая не была выделена с помощью emalloc() или estrdup() вы скорее всего получите ошибку сегментации (segmentation fault). Поэтому будьте внимательны и не забывайте освобождать память после использования.
Если вы выполняете компиляцию с опцией "-DDEBUG", PHP3 выдаст список всех блоков памяти, которые были выделены м помощью emalloc() или estrdup(), но не будут освобождены после завершения скрипта.
Для упрощения доступа к переменным в таблице символов определены следующие макросы:
SET_VAR_STRING(имя,значение) [1]
SET_VAR_DOUBLE(имя,значение)
SET_VAR_LONG(имя,значение)
Таблицы символов в PHP 3.0 реализованы в виде хэш-таблиц (hash table). В любой момент времени, &symbol_table указывает на 'главную' таблицу символов, а active_symbol_table указывает на активную в данный момент (они идентичны при запуске, или различны - внутри функции).
Следующие примеры используют 'active_symbol_table'. Вам придется заменить это на &symbol_table ели вы хотите работать с 'главной' таблицей символов. Те же самые функции можно применять и к массивам,как показано ниже.
Пример 0-3. Проверка наличия $foo в таблице символов
if (hash_exists(active_symbol_table,"foo",sizeof("foo"))) { существует... } else { не существует } |
Пример 0-4. Вычисление размера переменной в таблице символов
hash_find(active_symbol_table,"foo",sizeof("foo"),&pvalue); check(pvalue.type); |
В PHP 3.0 маcсивы реализованы с использованием тех же хэш-таблиц, что и в таблицах символов. Это означает что приведенные функции можно использовать и для проверки переменных внутри массивов.
В том случае, если вы хотите определить новое множество в таблице символов:
Сначала, вы можете проверить наличие, используя hash_exists() или hash_find().
Потом инициализируйте множество:
Пример 0-5. инициализация нового множества
pval arr; if (array_init(&arr) == FAILURE) { failed... }; hash_update(active_symbol_table,"foo",sizeof("foo"),&arr,sizeof(pval),NULL); |
Объявление нового (пустого) массива $foo в активной таблице символов.
Вот так вы можете добавить новые элементы:
Пример 0-6. Добавление элементов к массиву
pval entry; entry.type = IS_LONG; entry.value.lval = 5; /* определяет $foo["bar"] = 5 */ hash_update(arr.value.ht,"bar",sizeof("bar"),&entry,sizeof(pval),NULL); /* определяет $foo[7] = 5 */ hash_index_update(arr.value.ht,7,&entry,sizeof(pval),NULL); /* определяет следующее свободное место в $foo[], * $foo[8], to be 5 (работает как и в php2) */ hash_next_index_insert(arr.value.ht,&entry,sizeof(pval),NULL); |
Если вы хотите изменить значение, в хэш-таблице, вы должны сначала считать его. Для того чтобы избежать этого на верхнем уровне, вы можете добавлять pval ** к функции выполняющей добавление (обновление произойдет с адресом pval * добавляемого элемента). Если это значение NULL (как в приведенных примерах) - параметр будет проигнорирован.
hash_next_index_insert() использует примерно такую же логику как и "$foo[] = bar;" в PHP 2.0.
Если вы создаете новый массив с целью возврата его из функции, можно инициализировать его так же как в примере выше:
if (array_init(return_value) == FAILURE) { failed...; }
...и добавлять новые значения вспомогательными функциями:
add_next_index_long(return_value,long_value); add_next_index_double(return_value,double_value); add_next_index_string(return_value,estrdup(string_value));
Конечно, если добавление не было выполнено правильно после инициализации множества, вероятно вам понадобится проверить множество сначала:
pval *arr; if (hash_find(active_symbol_table,"foo",sizeof("foo"),(void **)&arr)==FAILURE) { can't find... } else { use arr->value.ht... }
Обратите внимание: hash_find получает лишь ссылку на указатель на pval, а не сам указатель на pval.
Практически любая hash-функция возвращает SUCCESS или FAILURE (hash_exists() возвращает булево значение).
Для упрощения возврата значений из функций определены следующие макросы:
Макросы RETURN_* устанавливают значение возвращаемое значение функции и возвращают управление:
Макросы RETVAL_* устанавливают возвращаемое значение, но не возвращает управление.
Все строковые макросы вызывают функцию estrdup() для переданного аргумента, поэтому вы можете спокойно освободить память, занятую под аргумент после выполнения макроса, или использовать статическую память.
Если ваша функция возвращает логическое значение, используйте RETURN_TRUE и RETURN_FALSE.
Ваша функция может также возвращать и сложные значения; такие как объект или массив.
Возвращение объекта:
Регистрация метода выполняется следующим образом:
add_method( return_value, function_name, function_ptr );
Функции для добавления полей(свойств):
Возвращение массива:
Функции для добавления элементов:
В PHP 3.0 имеется стандартные методы для работы с разными типами ресурсов. Это сделано для замены локально связанных списков в PHP 2.0.
Доступные функции:
Обычно эти функции используются драйверами SQL, хотя и могут используваться в любом другом месте, например, при работе с файловыми дескрипторами.
Пример работы с этими функциями показан ниже.
Пример 0-7. Добавление нового ресурса
RESOURCE *resource; /* ...выделение памяти под ресурс и создание его... */ /* добавление ресурса в список */ return_value->value.lval = php3_list_insert((void *) resource, LE_RESOURCE_TYPE); return_value->type = IS_LONG; |
Пример 0-8. Использование существующего ресурса
pval *resource_id; RESOURCE *resource; int type; convert_to_long(resource_id); resource = php3_list_find(resource_id->value.lval, &type); if (type != LE_RESOURCE_TYPE) { php3_error(E_WARNING,"ресурс с номером %d: неправильный тип",resource_id->value.lval); RETURN_FALSE; } /* ...использование ресурса... */ |
Пример 0-9. Удаление ресурса
pval *resource_id; RESOURCE *resource; int type; convert_to_long(resource_id); php3_list_delete(resource_id->value.lval); |
Типы ресурсов должны быть зарегистрированы в php3_list.h в списке list_entry_type. Кроме того, вы должны написать деструктор для каждого типа ресурсов в list_entry_destructor() файла list.c. Если вы не предпринимаете никаких дополнительных действий в деструкторе, вы должны добавить пустой деструктор.
В PHP 3.0 существует методы хранения постоянных ресурсов (ресурсов, которые сохраняются между вызовами). Один из модулей, который использует эту возможность - модуль MySQL, а также mSQL; вы можете изучить правила использования постоянных ресурсов читая код mysql.c. Следует обратить внимание на функции:
php3_mysql_do_connect |
php3_mysql_connect() |
php3_mysql_pconnect() |
Основная идея таблиц постоянных ресурсов заключается в следующем:
Если вы откроете файл mysql.c, вы заметите, что переписывать ничего не пришлось, за исключением более сложных функций связи.
Существует набор функций для работы с таблицами постоянных ресурсов, в котором функции для работы с таблицами постоянных ресурсов аналогичны функциям для работы с обычными списками ресурсов. В этом случае 'list' заменяется на 'plist':
Однако, эти функции могут оказаться бесполезными когда вы создаете постоянный модуль. Можно пользоваться тем, что постоянные таблицы ресурсов реализованы как хэш-таблицы. Например, в модулях MySQL/mSQL, когда вызывается pconnect(), создается строка на основе имени хоста, имени пользователя и его пароля и эта строка помещается в хэш-таблицу как ключ. В следующий раз когда будет вызвана pconnect() с теми же параметрами хоста, пользователя и пароля, будет сгенерирован тот же самый ключ и SQL-связь будет найдено в списке постоянных ресурсов.
Чтобы более полно понять работу функций plist* с хэш-таблицами ознакомтесь с файлами mysql.c или msql.c.
Внимание: ресурсы, предназначеные для таблицы постоянных ресурсов НЕ ДОЛЖНЫ создаваться с помощью менеджера памяти, т.е. они не должны быть созданы с использованием emalloc(), estrdup() и т.д. Вместо этого вы должные использовать обычные malloc(), strdup() и т.д. Причина этого проста: после исполнения запроса каждый участок памяти, выделенный меджером, удаляется. Следовательно не можете использовать менеджер памяти, так как список постоянных ресурсов не должен быть удален в конце сеанса.
Когда вы регистрите ресурс, который собираетесь добавить в таблицу постоянных, вы должны добавить деструкторы для них и в таблицу постоянных ресурсов, и обычных. Дескриптор в таблице обычных ресурсов должен быть пустым. Напротив, деструктор постоянного ресурса должен правильно освободить память, SQL-связи и т.д. Помните, что вы обязаны предусмотреть деструктор для любого типа ресурсов, даже если он будет пустым. Помните так же о том, что из-за того, что функции типа emalloc() не используются с постоянными ресурсами, вы не должны пользоваться в деструкторе функциями типа efree().
Многие возможности PHP3 могут быть сконфигурированы во время выполнения. Конфигурационные директивы могут быть либо в файле php3.ini, либо, в случае использования Apache, в файлах .conf модуля Apache. Преимущесво использования файлов .conf модуля Apache заключается в том, что в этом случае можно предусмотреть настройки для каждого каталога в отдельности. Эта возможность особенна полезна когда сервер поддерживает несколько виртуальных хостов.
Ниже описаны действия, которые необходимо предпринять для добавления директивы:
Для вызова пользовательских функций из внутренней нужно использовать call_user_function().
Функция call_user_function() возвращает SUCCESS в случае успеха, и FAILURE в том случае если функция не найдена. Вы должны проверить возвращенное значение! Если возврашен SUCCESS, вы отвечаете за удаление retval и pval. В случае возврата FAILURE, значение retval не определено.
Все внутренние функции должны быть сконструированы так, чтобы возможно было повторное использование ее. Это в частности означает, что в них не должны использоваться глобальные или статические переменные.
Функция call_user_function() принимает шесть аргументов:
Хэш-таблица в которой производится поиск функции.
Указатель на объект, с которым вызывается функция. NULL если вызывается глобальная функция. В первом случае аргумент function_table игнорируется и берется и определяется из объекта. Объект может быть изменен функцией (внутри функции он доступен через указатель $this). Если вы не хотите, чтобы это произошло, передайте копию объекта.
Имя вызываемой функции. Должно быть pval IS_STRING со значениями function_name.str.val и function_name.str.len установленными соответственно. Значение function_name изменяется вызовом call_user_function() - конвертируется в нижний регистр (прописные буквы). Если вы этого не хотите, передайте копию имени функции.
Указатель на структуру pval, в которую записывается возвращаемое функцией значение. Структура должна быть создана заранее, call_user_function() сама по себе не создает ничего.
Число параметров, передаваемое функции.
Массив указателей на значения, которые передаются в вызываемую функцию; первый аргумент имеет смещение 0, второй 1 и т.д. Массив является массивом указателей на pval. Аргументы пересылаются по ссылке, из чего следует, что если функция меняет аргумент, меняется и первоначальное значение. Опять же, если вы хотите этого избежать, передайте ссылку на копию объекта.
Чтобы выдать сообщение об ошибке внутри функций вы должны использовать функкцию php3_error(). Она принимает как минимум два параметра -- первый это категория ошибки, второй - форматирующая строка (как в стандартной функции printf()), за которым могут следовать аргументы форматирующей строки. Ниже представлены категории ошибок:
Сообщения этого типа по умолчанию не выводятся и сигнализируют о том, что в скрипте произошло что-то, что может означать ошибку, но может случится и при нормальном исполнении скрипта. Примерами могут служить попытка обращения к переменной, значение которой не определено, или вызов stat() для несуществующего файла.
Сообщения этого типа выводятся, но не прерывают выполнение скрипта. Они сообщают, что существует ошибка, которая должна быть отслежена скриптом до того, как будет сделан вызов. Примером служит вызов ereg() с неправильным регулярным выражением.
Сообщения этого типа также выводятся по умолчанию, и выполнение скрипта прекращается. Они означают неустранимые ошибки, такие как невозможность выделения памяти.
Ошибки данного класса генерируются исключительно синтаксическим анализатором. Этот класс ошибок приведен здесь исключительно для полноты изложения.
То же, что и E_ERROR, за исключением того, что генерируются ядром PHP. В функциях не должны генерироваться сообщения данного типа.
То же, что и E_WARNING, за исключением того, что генерируются ядром PHP. В функциях не должны генерироваться сообщения данного типа.
Отладчик PHP полезен при отслеживании неочевидных ошибок. Он работает через TCP порт каждый раз, когда стартует PHP. Все сообщения об ошибках из запроса будут посланы по этому TCP соединению. Информация этого раздела нужна при работе с такими редакторами как Emacs, или в интегрированной среде разработки (IDE).
Действия по установке отладчика:
Теперь все предупреждения, замечания и т.д. будут показаны на этом сокете, даже если вы выключили error_reporting().
Протокол отладчика основан на отдельных строках. Каждая строка имеет свой тип; несколько строк могут составлять сообщение. Каждое сообщение начинается со строки с типом start и заканчивается строкой с типом end. PHP может посылать строки с несколькими сообщениями одновременно.
Строка имеет следующий формат:
date time host(pid) type: message-data
Таблица 0-1. Типы строк отладчика
Тип | Значенне |
---|---|
start | Сообщает получающей программе, что в этом месте начинается сообщение. Содержимое строки data содержит тип сообщения об ошибке (см. ниже). |
message | Сообщение об ошибке. |
location | Имя файла и номер строки, содержащей ошибку. Первая строка location содержит местоположение, data содержит информацию file:line. Строка location всегда следует после строки message и function. |
frames | Число кадров в дампе стека. Если их четыре, ожидается информация о четырех уровнях вызываемых функций. Если эта строка отсутствует, глубина предполагается нулевой (ошибка произошла на высшем уровне вложенности). |
function | Имя функции, содержащей ошибку. Повторяется один раз для каждого уровня в стеке вызовов функции. |
end | Сообщает получающей программе, что сообщение отладчика закончено. |
Таблица 0-2. Типы ошибок отладчика
Отладчик | Внутренняя в PHP |
---|---|
warning | E_WARNING |
error | E_ERROR |
parse | E_PARSE |
notice | E_NOTICE |
core-error | E_CORE_ERROR |
core-warning | E_CORE_WARNING |
unknown | (любая другая) |
Пример 0-1. Пример сообщения об ошибке
1998-04-05 23:27:400966 lucifer.guardian.no(20481) start: notice |
Некоторые проблемы встречаются чаще других. Наиболее распространенные описаны в PHP3 FAQ, который можно найти по адресу: http://www.php.net/FAQ.php3
Если Вы считаете, что нашли ошибку в PHP3, то сообщите о ней. Разработчики PHP3 вероятно не знают об этом и если Вы о ней не сообщите, то она так и не будет исправлена. Формы для сообщений об ошибках доступны на сети сайтов PHP3, главная форма находится по адресу: http://ca.php.net/bugs.php3.
Если Вы все еще не можете решить проблему, то возможно кто-нибудь из списка рассылки PHP3 способен Вам помочь. Вы прежде всего должны проверить архив на тот случай, если кто-нибудь уже ответил людям с подобными проблемами. Архив можно найти по адресу http://www.tryc.on.ca/php3.html. Для того, чтобы подписаться на список рассылки PHP3 пошлите пустое письмо по адресу php3-subscribe@lists.php.net. Адрес списка рассылки php3@lists.php.net.
Если Вы хотите получить помощь через список рассылки, пожалуйста, попробуйте быть точным и дать необходимые детали о Вашем окружении (операционная система, версия PHP, какой используется web server, запускаете Вы PHP как CGI или в качестве модуля и т.д.) и желательно было бы предоставить код, чтобы другие могли воспроизвести и протестировать Вашу проблему.
PHP является мощным инструментом. Как и в случае с другими мощными средствами, Вы можете навредить сами себе. PHP функционирует таким образом, что если его небрежно использовать, то могут возникнуть проблемы с безопасностью на Вашей системе. Лучший путь для предотвращения такой ситуации - всегда знать, что Вы делаете. Для получения более подробной информации читайте Security chapter.
system(EscapeShellCmd($cmd))
Если параметр array установлен, то указанный массив будет заполнен выводом из программы. Помните, если массив уже содержит данные, то exec() добавляет свои данные. Если вы не хотите, что бы функция добавляла данные, вызывайте unset() для массива перед использованием exec().
Если параметр return_var установлен наряду с параметром array, то в него записывается результат выполнения команды.
Обратите внимание, что если ваша функция будет использовать данные из ввода пользователей, то надо использовать EscapeShellCmd() для того, что бы пользователи не смогли запустить произвольные программы.
См. также system(), PassThru(), popen() и EscapeShellCmd().
Обратите внимание, что если ваша функция будет использовать данные из ввода пользователей, то надо использовать EscapeShellCmd() для того, что бы пользователи не смогли запустить произвольные программы.
Вызов System() также пробует автоматически вставить в буфер вывода web сервера после каждой строки вывода, если PHP запущен как модель сервера.
Если вы хотите запустить команду и использовать все данные непосредственно без всякого вмешательства других программ, то используйте функцию PassThru(). См. также exec() и popen() функции.
См. также exec() и fpassthru().
Для использование функций SNMP в системе UNIX вам необходимо установить набор ucd-snmp. Ссылка на последнюю версию есть в PHP FAQ. В системе Windows эти функции доступны только в NT и не доступны в Win95/98.
int snmpget
(string hostname, string community, string object_id);Возвращает значание SNMP объекта при успехе и false при ошибке.
Функция snmpget() используется для чтения значения SNMP объекта, указанного в object_id. SNMP агент определяется именем хоста hostname и группа чтения определяется параметром community.
snmpget("127.0.0.1", "public", "system.SysContact.0")
array snmpwalk
(string hostname, string community, string object_id);Возвращает массив значений SNMP объектов начиная с object_id и false при ошибке.
Функция snmpwalk() используется для чтения всех значений у SNMP агента, определяемого параметром hostname. Community определяет группу чтения для агента. Нулевой object_id берется как корень дерева SNMP объектов и все объекты под этим деревом возвращаются как массив. Если object_id указан, то возвращаются все SNMP объекты ниже этого объекта.
$a = snmpwalk("127.0.0.1", "public", "");
Указанный выше вызов функции вернет все SNMP объекты из SNMP агента, напущенного на локальном хосте. По всем значениям можно пройти с помощью цикла
for($i=0; $i<count($a); $i++) { echo $a[$i]; }
Фрагмент примера сценария, который производит аутентификацию клиента на странице, должен быть следующим:
Пример 2-1. Пример HTTP аутификации<?php if(!isset($PHP_AUTH_USER)) { Header("WWW-Authenticate: Basic realm=\"My Realm\""); Header("HTTP/1.0 401 Unauthorized"); echo "Text to send if user hits Cancel button\n"; exit; } else { echo "Hello $PHP_AUTH_USER.<P>"; echo "You entered $PHP_AUTH_PW as your password.<P>"; } ?>
<?php Header("Content-type: image/gif"); $string=implode($argv," "); $im = imagecreatefromgif("images/button1.gif"); $orange = ImageColorAllocate($im, 220, 210, 60); $px = (imagesx($im)-7.5*strlen($string))/2; ImageString($im,3,$px,9,$string,$orange); ImageGif($im); ImageDestroy($im); ?>
Экран загрузки файла может быть организован созданием специальной формы, которая выглядит примерно так:
Пример 2-3. Форма загрузки файла<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST> <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000"> Send this file: <INPUT NAME="userfile" TYPE="file"> <INPUT TYPE="submit" VALUE="Send File"> </FORM>_URL_ должен указать на php html файл. Cкрытое поле MAX_FILE_SIZE должно предшествовать полю ввода файла и означает максимально допустимый размер файла. Значение определяется в байтах. Для этого файла при успешной загрузке будут определены следующие переменные :
$userfile - Временное имя файла под которым загруженный файл загружается в машину сервера. $userfile_name - Исходное имя файла в системе отправителя. $userfile_size - Размер загруженного файла в байтах. $userfile_type - Тип MIME файла, если броузер предоставил эту информацию. Например может быть "image/gif".Обратите внимание, что компонент вышеупомянутых переменных "$userfile" - это любое значение поля Name тега INPUT c TYPE=file обозначенное в форме загрузки. В приведенном выше примере формы загрузки мы назвали его "userfile".
Adabas D MySQL dBase Oracle Empress PostgreSQL FilePro Solid Informix Sybase InterBase Velocis mSQL Unix dbm
ereg() ereg_replace() eregi() eregi_replace() split()
ereg("abc",$string); /* Возвращает 'истина', если "abc" найдено в строке $string. */ ereg("^abc",$string); /* Возвращает 'истина', если "abc" найдено в начале строки $string. */ ereg("abc$",$string); /* Возвращает 'истина', если "abc" найдено в конце строки $string. */ eregi("(ozilla.[23]|MSIE.3)",$HTTP_USER_AGENT); /* Возвращает 'истина', если браузер клиента - Netscape 2, 3 или MSIE 3. */ ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)", $string,$regs); /* Помещает три слова - $regs[1], $regs[2] и $regs[3], разделенные пробелом. */ ereg_replace("^","<BR>",$string); /* Устанавливает тег <BR> в начало строки $string. */ ereg_replace("$","<BR>",$string); /* Устанавливает тег <BR> в конец строки $string. */ ereg_replace("\n","",$string); /* Отсекает символ "возврат каретки" в строке $string. */
1 - Нормальные Ошибки Функции(Normal Function Errors) 2 - Нормальные Предупреждения(Normal Warnings) 4 - Ошибки Синтаксического Анализатора(Parser Errors) 8 - Уведомления(Notices) : предупреждения, которые Вы можете проигнорировать но, которые могут подразумевать баги в вашем кодеЭти 4 типа комбинируются при определении ошибки, сообщая уровень. Ошибка по умолчанию, возвращает уровень 7, который является комбинацией 1 + 2 + 4, или все ошибки за исключением примечаний. Этот уровень может быть изменен в файле php3. ini директивой error_reporting. Он также может быть установлен в вашем файле Apache httpd.conf директивой php3_error_reporting, или же это может быть произведено во времени выполнения сценария, с использованием функции error_reporting ().
array parse_url
(string url);Эта функция возвращает ассоциативный массив, включающий множество различных существующих компонентов URL. Они включают "scheme", "host", "port", "user", "pass", "path", "query" и "fragment".
string urldecode
(string str);Декодирует любые %## закодированные в указанной строке. Возвращается декодированная строка.
Пример 1. пример urldecode() $a = split ('&', $querystring); $i = 0; while ($i < count ($a)) { $b = split ('=', $a [$i]); echo 'Value for parameter ', htmlspecialchars (urldecode ($b [0])), ' is ', htmlspecialchars (urldecode ($b [1])), "<BR>"; $i++; } |
См. также urlencode()
string urlencode
(string str);возвращает строку, в которой все не не буквенноцифровые символы кроме -_. заменены на символ (%) с следующими за ним двумя шестнадцатиричными цифрами и пробелами, закодированными как символ (+) . Это кодирование то же самое, что и кодирование данных, полученных методом POST из WWW формы, это тот же тип, что и тип данных application/x-www-form-urlencoded . Это отличается от RFC1738 кодирование (см. rawurlencode() ) в котором исторически сложилось, что пробелы кодируются символами (+). Эта функция удобна, когда кодируемая строка должна быть использована в части запроса URL, как удобный путь передавать переменные на следующую страницу:
Пример 1. пример urlencode() echo '<A HREF="mycgi?foo=', urlencode ($userinput), '">'; |
См. также urldecode()
string base64_encode
(string data);base64_encode() возвращает data закодированные в кодировке base64. Эта кодировка разработана для того, чтобы передовать двоичные данные через транспортные слои, которые не содержатвосьмой бит, такие как почтовые тела.
Данные в кодировке Base64 занимают примерно на 33% больше места, чем оригинал.
См. также: base64_decode(), RFC-2045 раздел 6.8.
string base64_decode
(string encoded_data);base64_decode() декодирует encoded_data и возвращает оригинал данных. Возвращаемые данные могут быть двоичными.
См. также: base64_encode(), RFC-2045 раздел 6.8.
Помните основную арифметику из школы? Эти операторы работают подобным образом
Таблица 7-1. Арифметические операторы
пример | название | результат |
---|---|---|
$a + $b | Сложение | Сумма $a и $b. |
$a - $b | Вычитание | Вычитает $b из $a. |
$a * $b | Умножение | Произведение $a и $b. |
$a / $b | Деление | Деление $a на $b. |
$a % $b | Остаток деления | Остаток от деления $a на $b. |
Оператор деления("/") возвращает целую величину(результат целочисленного деления) если оба оператора - целые (или строка преобразованная в целое). Если каждый операнд является величиной с плавающей запятой, выполнится деление с плавающей запятой.
B действительности есть только один оператор -- оператор конкатенации (".").
$a = "Hello "; $b = $a . "World!"; // теперь $b = "Hello World!"
Основным оператором присваивания является "=". Вы могли подумать что это "равно"("equal to"). Но это не так. В действительности это означает что левый операнд получает значение выражения в правых (собирательное присваивание).
Значением выражения присваивания является присваиваемая величина. Так что если "$a = 3", то это 3. Это позволит Вам делать некоторые мудреные вещи:
$a = ($b = 4) + 5; // теперь $a равно 9, а $b стало равным 4.
В дополнение к основным операторам присваивания есть дополнительные "комбинационные операторы",для всех арифметических и строковых операторов, что позволяет Вам использовать значение в выражении и затем устанавливать свое значение в результате этого выражения. Например:
$a = 3; $a += 5; // теперь $a равно 8, как если бы мы сказали: $a = $a + 5; $b = "Hello "; $b .= "There!"; // теперь $b равно "Hello There!", как если бы мы написали $b = $b . "There!";
Бинарные Операторы позволяют вам изменять биты в целых числах.
Table 7-2.Бинарные Операторы
пример | название | результат |
---|---|---|
$a & $b | И | Будут установлены биты, которые были установлены и в $a и в $b.
*Пример вебклуба: $a=5; /* 0101 */ $b=12; /* 1100 */ $c=$a & $b; /* $c будет равно 4 (0100) */ |
$a | $b | Или | Будут установлены биты, установленные в $a или $b .
*Пример вебклуба: $a=5; /* 0101 */ $b=12; /* 1100 */ $c=$a|$b; /* $c будет (1101) */ |
~ $a | Не | Будут установлены не_присутствующие в $a биты (реверс)
*Пример вебклуба: $a=5; /* 0101 */ ~ $a /* $a будет равно x (1010) */ |
Таблица 7-3. Логические операторы
пример | название | результат |
---|---|---|
$a and $b | И | Истина, если истинны $a и $b. |
$a or $b | Или | Истина, если истинны $a или $b. |
$a xor $b | Или | Истина, если истинны $a или $b, но не оба. |
! $a | Не | Истина, если не истинно $a. |
$a && $b | И | Истина, если истинны и $a и $b. |
$a || $b | Или | Истина, если истинны $a или $b. |
Разница в двух различных вариантах операторов "and" и "or" - в различии приоритетов операций. (см. ниже)
Операторы Сравнения, как и подразумевается в их имени, позволяют Вам сравнивать две величины.
Таблица 7-4. Операторы Сравнения
пример | название | результат |
---|---|---|
$a == $b | равно | истина, если $a эквивалентно $b. |
$a != $b | Не равно | Истина, если $a не эквивалентно $b. |
$a < $b | Меньше чем | Истина если $a меньше чем $b. |
$a > $b | Больше чем | Истина если $a больше $b. |
$a <= $b | Меньше или равно | Истина, если $a меньше или равно $b. |
$a >= $b | Больше или равно | Истина, если $a больше или равно $b. |
Эти функции требуют пакетов QMAIL (www.qmail.org) и vmailmgr Bruce Guenter http://www.qcc.sk.ca/~bguenter/distrib/vmailmgr/
Для всех функций следующие две переменные определяются как: строка vdomain - имя домена вашего виртуального домена (vdomain.com) , строка basepwd - пароль для 'real' пользователя, который поддерживает виртуальных пользователей.
Только до 8 символов распознаются в пароле для виртуальных пользователей
Возвращается статус для всех функциональных значений ответа в response.h
O ok |
1 плохой |
2 ошибка |
3 ошибка соединения |
Известные проблемы: vm_deluser() не удаляет директорию пользователя, хотя должена это делать. vm_addalias() в настоящее время не работает правильно.
<?php dl("php3_vmailmgr.so"); //load the shared library $vdomain="vdomain.com"; $basepwd="password"; ?>
int vm_adduser
(string vdomain, string basepwd, string newusername, string newuserpassword);Добавляет нового виртуального пользователя с паролем. newusername - это имя почтового login-а и newuserpassword - это пароль для это пользователя.
int vm_addalias
(string vdomain, string basepwd, string username, string alias);Добавляет псевдоним виртуальному пользователю. username - это имя почтового login-а и alias - это псевдоним для этого пользователя.
int vm_passwd
(string vdomain, string username, string password, string newpassword);Изменяет пароль виртуальных пользователей. username - это имя почтового login-а, password - старый пароль пользователя, и newpassword - новый пароль.
int vm_delalias
(string vdomain, string basepwd, string alias);Удаляет псевдоним.
int vm_deluser
(string vdomain, string username);
Удаляет виртуального пользователя.