Автозагрузка. Функция autoload

Опубликовал read-php в 28.01.2011 Категория: Средства для работы с объектами PHP

В некоторых ситуациях вам может понадобиться так организовать классы, чтобы определение каждого из них находилось в отдельном файле. У этого подхода есть свои недостатки, поскольку процесс включения файла влечет за собой некоторые издержки. Однако подобный вид организации может быть очень полезным, особенно при расширении системы, когда новые классы должны включаться во время выполнения программы . В таких случаях можно связать имя класса с именем файла, содержащего определение этого класса. Например, мы можем определить класс ShopProduct в файле с именем ShopProduct .php. С другой «Стороны, используя соглашение PEAR, для этого класса, скорее всего, было бы выбрано имя в соответствии с назначением пакета: business_ShopProduct.php.

В PHP 5 введена функция-перехватчик_autoload ( ), помогающая автоматизировать включение файлов классов. Ей передается один строковый аргумент. Когда интерпретатор PHP сталкивается с попыткой создания экземпляра неизвестного класса, он вызывает функцию_autoload ( ) (если она определена), передавая

ей имя класса в качестве аргумента. От программиста зависит, как он определит стратегию обнаружения и включения недостающего файла класса.

Давайте определим функцию autoload ( ).

function _autoload( $classname ) {

include once( «{$classname}.php» );

}

$productl = new ShopProduct( «Собачье сердце»,

«Михаил», «Булгаков», 5.99 );

Если предположить, что мы еще не включили файл, в котором определяется класс с именем ShopProduct, то создание экземпляра ShopProduct, похоже, должно закончиться неудачей. Интерпретатор PHP «видит», что мы определили функцию _autoload ( ), он вызывает ее и передает ей строку «ShopProduct». В нашей

реализации мы просто пытаемся включить файл ShopProduct. php. Конечно, этополучится, только если файл находится в текущем рабочем каталоге или в одном из каталогов, включенных в путь поиска. В этой ситуации не существует простого способа работы с пакетами. И это еще один случай, когда схема наименования, принятая в PEAR, себя оправдывает.

function _autoload( $classname } {

$path = str_replace(, DIRECTORY_SEPARATOR, $classname ); require_once( «{$path}.php» );

$y = new business_ShopProduct();

Как видите, функция_autoload ( ) преобразует символы подчеркивания, содержащиеся в переданном аргументе $classname, в символ разделения каталогов, заданный константой directory_separator («/» для систем Unix). Затем мы пытаемся включить файл класса (business/shopProduct .php). Если файл класса существует и класс, который он содержит, был назван корректно, то экземпляр объекта будет создан без возникновения ошибок. Конечно, для этого необходимо, чтобы программист соблюдал соглашение о наименовании, которое запрещает использование символа подчеркивания в именах классов, за исключением случаев, когда он используется для разделения пакетов.

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

Комментариев нет

Добавить комментарий