Каков принцип автоматической загрузки в PHP?
-
21-09-2019 - |
Вопрос
spl_autoload_register
могу выполнять такую работу, но я не понимаю, как она выполняется?
spl_autoload_register(array('Doctrine', 'autoload'));
Решение
Основная идея заключается в том, что вам не нужно писать 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
класс.