Каков принцип автоматической загрузки в PHP?

StackOverflow https://stackoverflow.com/questions/2302912

  •  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 класс.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top