Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.
[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]
Автозагрузка
The Pterodactyl
Copyright 2006 Pterodactyl's School
Copyright 2005 Pterodactyl's School.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
02.03.2006
История переиздания
Издание 1.00
02.03.2006
Первоначальная версия.
Аннотация
Рассмотрена функция __autoload(). Доработано учебное приложение.
Вначале были выражения require и include. Их недостаток заключался в том, что они не проверяли, был ли указанный в качестве параметра файл загружен ранее. Разработчикам приходилось самостоятельно следить за тем, какие файлы уже были включены, так как повторное включение файлов приводило к возникновению множества сообщений об ошибках из-за повторного определения одних и тех же переменных и функций. При работе над большими приложениями это было весьма
непросто.
Уже в ранних версиях PHP 4 появились выражения require_once и include_once. Они были лишены рассмотренного недостатка. Однако, разработчики все еще должны были следить за тем, чтобы все необходимые файлы были включены. В результате в начале каждого файла, входящего в крупные проекты, появлялось множество таких выражений. Отслеживать их стало легче, но все же не совсем легко.
Наконец, в PHP 5 появилась функция __autoload(), способная существенно облегчить разработчикам управление включаемыми файлами.
Функция __autoload()
Функция __autoload() имеет смысл только в рамках объектной модели. Она автоматически вызывается при попытке создать новый объект класса, который на данный момент еще не был определен (то есть его определение отсутствует как в текущем файле, так и в уже включенных). Обычно такая ситуация возникает, когда разработчик забывает включить нужный файл с определением требуемого класса перед созданием нового объекта. Ранее это вызвало бы фатальную ошибку, но теперь, благодаря
функции __autoload(), появляется шанс исправить допущенную невнимательность и продолжить исполнение скрипта.
Более того, следуя определенным соглашениям, можно вообще отказаться от явного включения файлов с определениями классов с помощью выражения require_once и ему подобных. Стандартная практика такого рода - определять в одном файле не более одного класса и использовать для класса и для файла одно и то же название (Пример 1, «Использование функции __autoload()»).
Ненамного сложнее аналогичная функция для автоматического включения файлов с определениями классов PEAR (Пример 2, «Функция __autoload() для PEAR»).
Замечание
Функция __autoload() принимает в качестве параметра название класса, к которому принадлежит создаваемый объект (название передается с сохранением регистра символов).
Пример 1. Использование функции __autoload()
<?php
function __autoload($className)
{
require_once "$className.php";
}
$foo = new Foo; // class Foo is defined in the Foo.php file
?>
Пример 2. Функция __autoload() для PEAR
<?php
function __autoload($className)
{
require_once str_replace('_', '/', $className).'.php';
}
?>
На все приложение может быть определена только одна функция __autoload(), поэтому может оказаться удобным вынести ее в отдельный файл (вместе с другими общими определениями), а затем включать этот файл в остальные.
Практикум
На этом практическом занятии добавим в наше учебное приложение функцию автозагрузки, одновременно отказавшись от явного включения файлов.
Поскольку наше приложение использует PEAR, а собственные классы также организованы в соответствии с его стандартами, то нам вполне подойдет одна из рассмотренных ранее функций (Пример 3, «Функция __autoload() для пакета SSS»). Расположить эту функции целесообразно в файле с главным классом SSS (но не в самом классе, а в качестве
самостоятельной функции).
После этого нам останется лишь удалить ставшие ненужными выражения require_once в файлах SSS.php и SSS/Controller.php, а также изменить версию пакета (SSS 0.07).
Замечание
К сожалению, использование выражения require_once все еще остается необходимым в файле с классом SSSEx (не входящем в пакет SSS, а лишь наследующим ему), а также в демонстрационном скрипте index.php. Можно было бы избежать этого путем вынесения функции __autoload() в отдельный файл, но тогда бы все равно пришлось включать этот файл (хотя бы в демонстрационный
скрипт), а это потребовало бы разработки дополнительных инструкций для конечного пользователя и выполнения им не совсем обычных действий.