Система автоматического построения PHP Учебник

Интерактивные уроки Flash
Абстрактное искусство
Рисование и закрашивание
Символы и их трансформы
Инженерная графика
Слои
Набор текста
Кнопки
Кадрированная анимация
Экономическая математика
Математический анализ
Применение производных в исследовании функций
Аппарат дифференциальных уравнений в экономике
Элементы линейного программирования
Динамическое программирование
Методика решений задач
по кинематике
Механика жидкостей и газов
Законы постоянного тока
Динамика и законы сохранения
в механике
Методика решения задач
по Электростатике
Основы Flash
Инструменты рисования
Работа с цветом
Импортированная графика
Озвучивание
Работа с объектами
Работа со слоями
Преобразование анимации
Создание анимации
Редактирование анимации
Конвертирование цветовых
моделей
Создание интерактивных
фильмов
Управление Flash Player
Распечатка фильма
Публикация фильма Flash
Публикация HTML
Публикация файлов GIF
Публикация файлов PNG
Форматы экспорта файлов
Windows AVI Реляционная
база данных
Постулаты квантовой механики
Создание карты изображения
Управление макетом страницы
Интерфейс пользователя
Интеллектуальные фрагменты
Учебник по схемотехнике,
альбом схем
Источник питания
охранного устройства
Источник питания для АОНа
Источник бесперебойного
питания
Индикатор
Логические пробники
Схема вольтметра
переменного тока
Помехозащищенная схема
защиты
Транзисторный ограничитель
Стабилизатор напряжения
Таймер
Разрядники
Схема индикатора напряжения
Схема дублирования
Триггерная схема
Методы восстановления
аккумуляторов
Схема зарядного устройства
Схема выпрямителя
Схема индикатора «фазы»
Учебник PHP
Работа со строками
Создание расширений
Работа с переменными
Определение количества
аргументов
Доступ к аргументам
Установка на системах Windows
Область видимости переменной
Куки HTTP
Освобождение ресурсов
PHP-скрипты
Установка на системы UNIX
Возвращаемые функциями
значения
Замена переменных в строках
Безопасный режим
Использование функций
FAQ
Система автоматического
построения
 

PHP 4.0 предлагает чрезвычайно гибкую систему автоматического построения/build. Все модули находятся в поддиректории ext. Помимо своих собственных ресурсов, каждый модуль состоит из файла M4 который отвечает за компиляцию

Оба файла генерируются автоматически вместе с .cvsignore небольшим скриптом оболочки под названием ext_skel, который находится в директории ext. В качестве аргумента он принимает имя создаваемого модуля. Скрипт затем создаёт директорию с тем же именем и соответствующие файлы config.m4 и Makefile.in. Общие виды парка

Пошагово этот процесс выглядит так:
root@dev:/usr/local/src/php4/ext > ./ext_skel my_module Creating 
directory Creating basic files: config.m4 Makefile.in .cvsignore [done]. To use 
your new extension, you will have to execute the following steps: $ cd .. $ ./buildconf 
$ ./configure (your extension is automatically enabled) $ vi ext/my_module/my_module.c 
$ make Repeat the last two steps as often as necessary.

Эта инструкция создаёт вышеупомянутые файлы. Для того чтобы включить новый модель в процесс автоматической конфигурации и построения, вы должны запустить buildconf, который регенерирует скрипт configure путём поиска в директории ext и включения всех найденных файлов config.m4. Системы мультимедиа начинались со звука,

Наконец, запуск configure разбирает все опции конфигурации и генерирует makefile на основе этих опций и опций, специфицированных в Makefile.in.

В Листинге 9.1 показан сгенерированный Makefile.in: жд перевозка контейнеров

Листинг 9.1. Файл Makefile.in по умолчанию.
# $Id: Extending_Zend_Build.xml,v 1.1 2002/01/09 12:16:30 derick Exp $ LTLIBRARY_NAME 
= libmy_module.la LTLIBRARY_SOURCES = my_module.c LTLIBRARY_SHARED_NAME = my_module.la 
include $(top_srcdir)/build/dynlib.mk
Сопротивление материалов Изгиб. Классификация видов изгиба. Внутренние силовые факторы при изгибе Внутренние силовые факторы при изгибе

Тут мало что можно сказать: Он содержит имена входного и выходного файлов. Вы можете также специфицировать build-инструкции для других файлов, если ваш модуль строится из нескольких исходных файлов.

Файл config.m4 по умолчанию, показанный в Листинге 9.2, немного сложнее: Новгородская архитектура XI-ХV столетий

XI век в древнерусской архитектуре — это эпоха «трех Софий», Византийская архитектурная традиция, воспринятая русскими мастерами, с наибольшей полнотой отразилась в киевском соборе Святой Софии. Однако чем дальше от Южной Руси — Киева, Чернигова, Переяславля — строился храм, тем больше в нём черт оригинального русского зодчества, тем больше собственных находок привносили в строительную практику местные мастера. «Младшие сестры» Софии Киевской — София Новгородская и София Полоц­кая — возводились по образцу «старшей сестры», но северные зодчие творчески преобразили его до неузнаваемости. Софийский собор в Новгороде Великом

Листинг 9.2. Файл config.m4 по умолчанию.
dnl $Id: Extending_Zend_Build.xml,v 1.1 2002/01/09 12:16:30 derick Exp $ 
dnl config.m4 for extension my_module dnl don't forget to call PHP_EXTENSION(my_module) 
dnl If your extension references something external, use with: PHP_ARG_WITH(my_module, 
for my_module support, dnl Make sure that the comment is aligned: [ --with-my_module 
Include my_module support]) dnl Otherwise use enable: PHP_ARG_ENABLE(my_module, 
whether to enable my_module support, dnl Make sure that the comment is aligned: 
[ --enable-my_module Enable my_module support]) if test "$PHP_MY_MODULE" != "no"; 
then dnl Action.. PHP_EXTENSION(my_module, $ext_shared) fi

Если вы плохо знакомы с M4-файлами (теперь самое время познакомиться с ними получше), всё это может вызвать некоторое замешательство; но в действительности всё довольно просто.

Примечание: всё с префиксом dnl считается комментарием и не разбирается.

Файл config.m4 отвечает за разбор опций командной строки, передаваемых в configure на этапе конфигурирования. Это означает, что он должен проверять наличие требуемых внешних файлов и выполнять схожие задачи по конфигурированию и установке.

Файл по умолчанию создаёт две директивы конфигурирования в скрипте configure: --with-my_module и --enable-my_module.
Используйте первую опцию при обращении к внешним файлам (как с директивой --with-apache, которая обращается к директории Apache).
Используйте вторую опцию, когда пользователь должен просто решить, включать ли ваше расширение. Независимо от используемой опции вы должны раскомментировать другую опцию, ненужную; то есть, если вы используете --enable-my_module, вы должны удалить поддержку --with-my_module, и наоборот.

По умолчанию файл config.m4, созданный скриптом ext_skel, принимает обе директивы и автоматически включает ваше расширение. Включение расширения выполняется путём использования макроса PHP_EXTENSION. Для изменения поведения по умолчанию и подключения вашего модуля в исполняемый PHP, когда это нужно пользователю (явно специфицируя --enable-my_module или
--with-my_module
), измените test for $PHP_MY_MODULE на == "yes":
if test "$PHP_MY_MODULE" == "yes"; then dnl Action.. PHP_EXTENSION(my_module, 
$ext_shared) fi

Это может потребовать от вас использования --enable-my_module каждый раз при реконфигурировании и рекомпиляции PHP.

Примечание: не забывайте запускать buildconf каждый раз при изменении config.m4!

Далее в этой главе мы обсудим детали работы макросов M4, доступных вашим скриптам конфигурирования. Пока же мы просто используем файлы по умолчанию. Все примеры исходников на CD-ROM работают с файлами config.m4. Для включения их процесс построения PHP, просто скопируйте директории исходников в вашу директорию ext РНР, запустите buildconf, а затем подключите сэмплы необходимых модулей путём использования соответствующих директив--enable-* совместно с configure.

O

ob_clean ob_end_clean ob_end_flush ob_flush ob_get_contents ob_get_length ob_get_level ob_gzhandler ob_iconv_handler ob_implicit_flush ob_start ocibindbyname ocicancel ocicollappend ocicollassign ocicollassignelem ocicollgetelem ocicollmax ocicollsize ocicolltrim ocicolumnisnull ocicolumnname ocicolumnprecision ocicolumnscale ocicolumnsize ocicolumntype ocicolumntyperaw ocicommit ocidefinebyname ocierror ociexecute ocifetch ocifetchinto ocifetchstatement ocifreecollection ocifreecursor ocifreedesc ocifreestatement ociinternaldebug ociloadlob ocilogoff ocilogon ocinewcollection ocinewcursor ocinewdescriptor ocinlogon ocinumcols ociparse ociplogon ociresult ocirollback ocirowcount ocisavelob ocisavelobfile ociserverversion ocisetprefetch ocistatementtype ociwritelobtofile octdec odbc_autocommit odbc_binmode odbc_close odbc_close_all odbc_columnprivileges odbc_columns odbc_commit odbc_connect odbc_cursor odbc_do odbc_error odbc_errormsg odbc_exec odbc_execute odbc_fetch_array odbc_fetch_into odbc_fetch_object odbc_fetch_row odbc_field_len odbc_field_name odbc_field_num odbc_field_precision odbc_field_scale odbc_field_type odbc_foreignkeys odbc_free_result odbc_gettypeinfo odbc_longreadlen odbc_next_result odbc_num_fields odbc_num_rows odbc_pconnect odbc_prepare odbc_primarykeys odbc_procedurecolumns odbc_procedures odbc_result odbc_result_all odbc_rollback odbc_setoption odbc_specialcolumns odbc_statistics odbc_tableprivileges odbc_tables opendir openlog openssl_csr_export

Вызов пользовательских функций

Вы можете вызывать пользовательские функции из ваших модулей, что очень удобно при реализации callbacks/обратных вызовов; например, для прохода по массиву, поиска или просто для программ на базе событий.

Пользовательские функции можно вызывать функцией call_user_function_ex(). Необходимы: hash-значение для таблицы функции, доступ к которой вы хотите получить, указатель на объект (если хотите вызвать метод), имя функции, return-значение, количество аргументов, массив аргументов и флаг, указывающий, хотите ли вы использовать zval-сепарацию.
ZEND_API int 
call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, 
zval **retval_ptr_ptr, int param_count, zval **params[], int no_separation);

Заметьте, что вы не должны специфицировать и function_table, и object; нужен только один из них. Если вы хотите вызвать метод, вы должны предоставить объект, который содержит этот метод, при этом call_user_function() автоматически устанавливает таблицу функции на таблицу функции этого объекта. Иначе вам необходимо специфицировать только function_table и можно установить object в NULL.

Обычно по умолчанию таблица функции это таблица "корневой" функции, содержащая вхождения всех функций. Эта таблица функции является частью глобалов компилятора, и доступ к ней может быть обеспечен макросом CG. Для введения глобалов компилятора в вашу функцию, вызовите однократно макрос CLS_FETCH.

Имя функции специфицируется в zval-контейнере. На первый взгляд это может показаться необычным, но это довольно логичный шаг, поскольку в большинстве случаев вы будете принимать имена функций как параметры вызывающих функций в вашем скрипте, которые в свою очередь также содержаться в zval-контейнерах. Таким образом, вы должны лишь передать ваши аргументы этой функции. Этот zval обязан иметь тип IS_STRING.

Следующий аргумент это указатель на return-значение. Вы не должны выделять память для этого контейнера; функция сделает это сама. Однако вы должны уничтожить этот контейнер (используя zval_dtor()) впоследствии!

Затем идёт целочисленный parameter_count и массив, содержащий все необходимые параметры. Последний аргумент специфицирует, должна ли функция выполнять zval-сепарацию - он должен всегда быть установлен в 0. Если он установлен в 1, функция потребляет меньше памяти, но терпит неудачу, если любой из параметров требует сепарации.

Листинг 9.16 и Рисунок 9.11 показывают вызов пользовательской функции. Этот код вызывает функцию, которая предоставлена как аргумент, и непосредственно передаёт return-значение этой функции как своё собственное return-значение. Обратите внимание на использование вызовов конструктора и деструктора в конце - это может быть и не обязательно здесь (так как они являются раздельными значениями, и присвоение проходит безопасно), но так 100-процентно надёжнее.

openssl_csr_export_to_file openssl_csr_new openssl_csr_sign openssl_error_string openssl_free_key openssl_get_privatekey openssl_get_publickey openssl_open openssl_pkcs7_decrypt openssl_pkcs7_encrypt openssl_pkcs7_sign openssl_pkcs7_verify openssl_pkey_export openssl_pkey_export_to_file openssl_pkey_new openssl_private_decrypt openssl_private_encrypt openssl_public_decrypt openssl_public_encrypt openssl_seal openssl_sign openssl_verify openssl_x509_check_private_key openssl_x509_checkpurpose openssl_x509_export openssl_x509_export_to_file openssl_x509_free openssl_x509_parse openssl_x509_read ora_bind ora_close ora_columnname ora_columnsize ora_columntype ora_commit ora_commitoff ora_commiton ora_do ora_error ora_errorcode ora_exec ora_fetch ora_fetch_into ora_getcolumn ora_logoff ora_logon ora_numcols ora_numrows ora_open ora_parse ora_plogon ora_rollback ord overload ovrimos_close ovrimos_commit ovrimos_connect ovrimos_cursor ovrimos_exec ovrimos_execute ovrimos_fetch_into ovrimos_fetch_row ovrimos_field_len ovrimos_field_name ovrimos_field_num ovrimos_field_type ovrimos_free_result ovrimos_longreadlen ovrimos_num_fields ovrimos_num_rows ovrimos_prepare ovrimos_result ovrimos_result_all ovrimos_rollback

Дублирование содержимого переменной: конструктор Copy

Рано или поздно вам понадобится присвоить содержимое одного zval-контейнера другому. Это легче сказать, чем сделать, так как zval-контейнер содержит не только информацию о типе, но и ссылки на места во внутренних данных Zend. Например, в зависимости от своих размеров, массивы и объекты могут быть вложены в большое количество вхождений хэш-таблицы. Присваивая один zval другому, вы исключаете дублирование вхождений хэш-таблицы, используя только одну ссылку на неё.

Для копирования сложных видов данных используйте конструктор copy. Конструкторы сopy обычно определяются в языках, поддерживающих перегрузку операций для копирования сложных/комплексных типов. Если вы определяете объект в таком языке, у вас имеется возможность перегрузить/overloa операцию "=", которая обычно отвечает за присвоение содержимого левого значения/lvalue (результата вычисления левой части операции) правому значению/rvalue (то же самое с правой стороны).

Перегрузка означает присвоение другого значения данной операции и обычно используется для присвоения вызова функции данной операции. В любом месте программы, где эта операция используется с таким объектом, эта функция будет вызываться с lvalue и rvalue в качестве параметров. Снабжённая этой информацией, она может выполнить операцию предназначенную для операции "=" (обычно расширенную форму копирования).

Такая же форма "расширенного копирования" необходима для zval-контейнеров РНР. Итак, в случае с массивом это расширенное копирование предполагает воссоздание всех вхождений хэш-таблицы, относящихся к данному массиву. Для строк должно гарантироваться выделение соответствующей памяти, и т.д.

Zend поставляется с такой функцией, zend_copy_ctor() (предыдущим PHP-эквивалентом была pval_copy_constructor()).

Наиболее известной демонстрацией является функция, принимающая сложный тип как аргумент, модифицирующая его, а затем возвращающая аргумент:
zval 
*parameter; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &parameter) 
== FAILURE) return; } // здесь модифицируйте parameter // теперь мы возвращаем 
модифицированный контейнер: *return_value == *parameter; zval_copy_ctor(return_value);

Первая часть функции это запрос аргумента. После (left out) модификации, однако, становится уже интересно: Контейнер для parameter присваивается контейнеру (предопределённому) return_value. Теперь, чтобы эффективно дублировать содержимое, вызывается конструктор copy. Конструктор copy работает непосредственно с предоставленным аргументом, и стандартными return-значениями являются FAILURE при неудаче и SUCCESS при успехе.

Если в этом примере опустить вызов конструктора copy, и parameter, и return_value будут указывать на одни и те же внутренние данные, что означает, что return_value будет недопустимой дополнительной ссылкой на те же самые структуры данных. Где бы ни возникли изменения в данных, на которые указывает parameter, return_value может быть изменено. Таким образом, чтобы создать разные копии, обязан использовать конструктор copy.

Компаньон конструктора copy в Zend API, деструктор zval_dtor(), выполняет противоположные конструктору действия.