Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5: Новые возможности.

  Все выпуски  

Автозагрузка


PHP 5: Новые возможности.

Вниманию читателей!

Отдельные выпуски рассылки в той или иной мере взаимосвязаны; особенно, это относится к материалам практических занятий.

С предыдущими выпусками Вы можете ознакомиться:

  1. в архиве рассылки (оригиналы выпусков);
  2. на сайте рассылки (исправленные и дополненные версии).

# # #

Вы также можете подписаться на рассылку "PHP 5 для начинающих".

PHP 6 уже в разработке!

Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.

http://pterodactyl.l2p.net/e107/

[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]

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

Уже в ранних версиях PHP 4 появились выражения require_once и include_once. Они были лишены рассмотренного недостатка. Однако, разработчики все еще должны были следить за тем, чтобы все необходимые файлы были включены. В результате в начале каждого файла, входящего в крупные проекты, появлялось множество таких выражений. Отслеживать их стало легче, но все же не совсем легко.

Наконец, в PHP 5 появилась функция __autoload(), способная существенно облегчить разработчикам управление включаемыми файлами.

Функция __autoload() имеет смысл только в рамках объектной модели. Она автоматически вызывается при попытке создать новый объект класса, который на данный момент еще не был определен (то есть его определение отсутствует как в текущем файле, так и в уже включенных). Обычно такая ситуация возникает, когда разработчик забывает включить нужный файл с определением требуемого класса перед созданием нового объекта. Ранее это вызвало бы фатальную ошибку, но теперь, благодаря функции __autoload(), появляется шанс исправить допущенную невнимательность и продолжить исполнение скрипта.

Более того, следуя определенным соглашениям, можно вообще отказаться от явного включения файлов с определениями классов с помощью выражения require_once и ему подобных. Стандартная практика такого рода - определять в одном файле не более одного класса и использовать для класса и для файла одно и то же название (Пример 1, «Использование функции __autoload()»). Ненамного сложнее аналогичная функция для автоматического включения файлов с определениями классов PEAR (Пример 2, «Функция __autoload() для PEAR»).

Замечание

Функция __autoload() принимает в качестве параметра название класса, к которому принадлежит создаваемый объект (название передается с сохранением регистра символов).

На все приложение может быть определена только одна функция __autoload(), поэтому может оказаться удобным вынести ее в отдельный файл (вместе с другими общими определениями), а затем включать этот файл в остальные.

На этом практическом занятии добавим в наше учебное приложение функцию автозагрузки, одновременно отказавшись от явного включения файлов.

Поскольку наше приложение использует PEAR, а собственные классы также организованы в соответствии с его стандартами, то нам вполне подойдет одна из рассмотренных ранее функций (Пример 3, «Функция __autoload() для пакета SSS»). Расположить эту функции целесообразно в файле с главным классом SSS (но не в самом классе, а в качестве самостоятельной функции).

После этого нам останется лишь удалить ставшие ненужными выражения require_once в файлах SSS.php и SSS/Controller.php, а также изменить версию пакета (SSS 0.07).

Замечание

К сожалению, использование выражения require_once все еще остается необходимым в файле с классом SSSEx (не входящем в пакет SSS, а лишь наследующим ему), а также в демонстрационном скрипте index.php. Можно было бы избежать этого путем вынесения функции __autoload() в отдельный файл, но тогда бы все равно пришлось включать этот файл (хотя бы в демонстрационный скрипт), а это потребовало бы разработки дополнительных инструкций для конечного пользователя и выполнения им не совсем обычных действий.

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

Created with DocBook Created with Libxslt


В избранное