Строки обрабатываются Zend-машиной несколько иначе, чем другие значения, такие
как integer, Boolean, etc., которые не требуют дополнительного выделения памяти
под хранение своих значений. Если вы хотите возвратить из функции строку, вводите
новую строковую переменную в таблицу символов или делаете что-нибудь подобное,
вы должны убедиться, что память, которую использует строка, была выделена ранее
функциями e*(). (Пока это может быть не очень понятно; просто запомните
это - мы вскоре вернёмся к этому вопросу.) Необходимость использования специализированных
технических средств для компьютерной
графики и анимации
date
dba_closedba_delete dba_exists
dba_fetchdba_firstkey dba_insert
dba_nextkeydba_open dba_optimize
dba_popendba_replace dba_sync
dbase_add_record dbase_close
dbase_create dbase_delete_record
dbase_get_record dbase_get_record_with_names
dbase_numfields dbase_numrecords
dbase_open dbase_pack
dbase_replace_record dblist
dbmclosedbmdelete dbmexists
dbmfetchdbmfirstkey dbminsert
dbmnextkeydbmopen dbmreplace
dbplus_adddbplus_aql "Расширить PHP" легче
сказать, чем сделать. PHP вырос в полноценную утилиту, состоящую из нескольких
мегабайт исходного кода. При структурировании этой главы мы остановились на реализации
подхода "обучения через выполнение". Это не самый научный и профессиональный подход,
но этот метод более привлекателен и даёт наилучший конечный результат.
В последующих
разделах вы быстро научитесь, как сделать так, чтобы самые основные расширения
работали почти постоянно.
Затем вы узнаете о продвинутой API-функциональности
Zend. Альтернативно можно было бы попытаться объединить функциональность, дизайн,
подсказки, трюки, и т.п. в единое целое, давая таким образом полный обзор общей
картины, прежде чем делать что-либо практически. Хотя это "лучший" метод, поскольку
никаких неточностей не будет, он требует больших затрат времени и энергии, почему
мы и решили использовать прямой подход. Архитектура
Киевской Руси Русское искусство эпохи Средневековья начиная с X в. и вплоть
до конца XVII столетия неразрывно связано с Церковью и христианской верой, которую
русский народ вслед за своими византийскими учителями называл православной.
Заметьте,
что, хотя в этой главе сделана попытка дать как можно больше информации о внутренней
работе PHP, невозможно дать абсолютно полный справочник расширения PHP, который
обеспечивал бы 100% работоспособность во всех случаях. Можно разобраться в PHP,
при таком сложном и объёмном пакете, только в том случае, если вы ознакомитесь
с ним практически, поэтому мы советуем вам работать с исходным материалом.
Что
такое Zend и что такое PHP?
Имя Zend это имя машины языка, ядра
PHP. Термин PHP это вся система целиком. Это не так уж сложно понять (см.
Рисунок 9.1). Чтобы реализовать интерпретатор Web-скриптов, необходимы три части:
-
Интерпретатор анализирует входной код, транслирует
и выполняет его. Сопротивление материалов
Механические испытания. Статические испытания на растяжение и сжатие Характеристики
пластичности определяют способность матерала к деформированию
-
Функциональность
реализует функциональность языка (его функции и т.д.).
-
Интерфейс
взаимодействует с Web-сервером и т.д.
Zend полностью выполняет работу
части 1 и частично - части 2; PHP выполняет работу частей 2 и 3. Вместе они образуют
законченный пакет PHP. Zend формирует только ядро языка, реализуя PHP в самой
основе с помощью некоторых предопределённых функций. PHP содержит все модули,
которые реально создают свойства языка - dbplus_chdir
dbplus_close dbplus_curr
dbplus_errcode dbplus_errno
dbplus_find dbplus_first
dbplus_flush dbplus_freealllocks
dbplus_freelock dbplus_freerlocks
dbplus_getlock dbplus_getunique
dbplus_info dbplus_last
dbplus_lockrel dbplus_next
dbplus_open dbplus_prev
dbplus_rchperm dbplus_rcreate
dbplus_rcrtexact dbplus_rcrtlike
dbplus_resolve dbplus_restorepos
dbplus_rkeys dbplus_ropen
dbplus_rquery dbplus_rrename
dbplus_rsecindex dbplus_runlink
dbplus_rzap dbplus_savepos
dbplus_setindex dbplus_setindexbynumber
dbplus_sql dbplus_tcl
dbplus_tremove dbplus_undo
dbplus_undoprepare dbplus_unlockrel
dbplus_unselect dbplus_update
dbplus_xlockrel dbplus_xunlockrel
dbx_close dbx_compare
dbx_connect dbx_error
dbx_query dbx_sort
dcgettext dcngettext
dcngettext debugger_off
debugger_on decbin
dechex decoct define
define_syslog_variables defined
deg2rad delete dgettext
die dio_close dio_fcntl
dio_open dio_read
dio_seek dio_stat
dio_truncate dio_writedir
dirname disk_free_space
disk_total_space diskfreespace
dl domxml_version
dotnet_load doubleval
-
Zend-машина
Разумеется, расширения могут быть реализованы непосредственно
в Zend-машине. Эта стратегия хороша, если необходимо изменить поведение языка
или нужны специальные функции, встроенные непосредственно в ядро языка. Вообще
лучше исключить модификацию Zend-машины. Эти изменения могут привести к несовместимости
с остальным миром. Модификации могут быть исключены из главных исходников PHP
и переопределяются при следующем обновлении с использованием "официальных" исходников.
Следовательно, этот метод можно считать неправильной практикой и, из-за его редкого
применения, мы не рассматриваем его в этой книге.
Внешние модули
Внешние
модули можно загружать в ходе работы скрипта через использование функции dl().
Эта функция загружает совместно используемый/shared объект с диска и делает его
функциональность доступной скрипту, с которым она связывается. После завершения
работы скрипта внешний модуль выгружается из памяти. Этот метод имеет как преимущества,
так и недостатки, как показано в таблице:
| Преимущества | Недостатки |
| Внешние модули не требуют перекомпиляции PHP. | Совместно
используемые объекты должны загружаться всякий раз при выполнении скрипта (при
каждом его запуске), что очень медленно. |
| Размер
PHP остаётся небольшим за счёт вынесения вовне определённой функциональности. | Внешние
файлы занимают дисковое пространство. |
| | Каждый
скрипт, который хочет использовать функциональность внешнего модуля, должен специально
включать вызов dl(), либо тэг extension в php.ini должен
быть изменён (что не всегда является подходящим решением). |
Суммируя
сказанное: внешние модули подходят для создания продуктов сторонних производителей,
небольших редко используемых дополнений к PHP или для целей тестирования. При
быстрой разработке внешней функциональности внешние модули дают наилучшие результаты.
При частом использовании, больших реализациях и сложном коде недостатки перевешивают
достоинства.
Можно использовать тэг extension в php.ini
для создания дополнительных внешних модулей для PHP. Эти внешние модули полностью
отделены от основного пакета, что очень удобно при разработке коммерческих приложений.
Коммерческие дистрибьюторы могут распространять диски или архивы, содержащие только
их дополнительные модули без необходимости создавать фиксированные и объёмные
исполняемые файлы PHP, не позволяющие подключать другие модули.