Каков принцип автозагрузки в PHP? - PullRequest
0 голосов
/ 20 февраля 2010

spl_autoload_register может выполнять такую ​​работу, но я не понимаю, как эта работа выполняется?

spl_autoload_register(array('Doctrine', 'autoload'));

1 Ответ

6 голосов
/ 20 февраля 2010

Основная идея заключается в том, что вам больше не нужно писать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...