Основная идея заключается в том, что вам больше не нужно писать include
/ require
инструкции: всякий раз, когда вы пытаетесь использовать неопределенный класс, PHP вызывает автозагрузчик.
Задача автозагрузчика состоит в том, чтобы определить, какой файл должен быть загружен, и include
это, так что класс становится определенным.
Затем PHP может использовать этот класс, как если бы вы написали инструкцию include
, которая фактически была выполнена в функции автозагрузки.
«Хитрость» в том, что функция автозагрузки:
- получает только имя класса
- должен определить, какой файл загрузить, т. Е. Какой файл содержит этот класс.
Это является причиной соглашения об именовании, такого как соглашение PEAR, в котором говорится, что класс, такой как Project_SubProject_Component_Name
, сопоставлен с файлами, такими как Project/SubProject/Component/Name.php
- т.е. '_
' в именах классов заменяется на косая черта (каталоги, подкаталоги) в файловой системе.
Например, если вы посмотрите на метод Doctrine_Core::autoload
, который в вашем случае будет вызываться как автозагрузчик, он содержит эту часть кода (после рассмотрения некоторых конкретных случаев) :
$class = self::getPath()
. DIRECTORY_SEPARATOR .
str_replace('_', DIRECTORY_SEPARATOR, $className)
. '.php';
if (file_exists($class)) {
require $class;
return true;
}
return false;
Это означает, что имя класса сопоставляется с файловой системой, заменяя '_
' на '/
' и добавляя окончательный .php
к имени файла.
Например, если вы пытаетесь использовать класс Doctrine_Query_Filter_Chain
и он не известен PHP, будет вызвана функция Doctrine_Core::autoload
; он определит, что файл, который должен быть загружен, Doctrine/Query/Filter/Chain.php
; и поскольку этот файл существует, он будет включен - это означает, что PHP теперь «знает» класс Doctrine_Query_Filter_Chain
.