PHP spl_автоматическая загрузка
-
19-09-2019 - |
Вопрос
я действительно не получаю документы для spl_autoload
bool spl_autoload_register ([ callback $autoload_function ] )
насколько я понимаю, он попытается запустить зарегистрированные функции, когда php наткнется на класс, который еще не загружен.итак, пример,
public function autoload() {
require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();
вызовет ли require запуск?значит, я также могу зарегистрировать множество функций автоматической загрузки?
public function autoloadXXX() {...}
public function autoloadYYY() {...}
public function autoloadZZZ() {...}
spl_autoload_register('autoloadXXX');
spl_autoload_register('autoloadYYY');
spl_autoload_register('autoloadZZZ');
в случае доктрины,
require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
передан массив, поэтому я предполагаю, что он попытается запустить функцию автозапуска в классе Doctrine (что было обязательным)?
Решение
spl_autoloader_register
регистрирует функцию / метод обратного вызова, который будет вызываться, когда ваш код пытается использовать неизвестный класс.
A обратный вызов функция может быть описана несколькими способами :
- простое имя функции :
'my_function'
- статический метод класса :
array('MyClass', 'myMethod')
- метод экземпляра класса :
array($myObject, 'myMethod')
В случае с Doctrine это, по-видимому, второе решение :если используется класс, который PHP не знает, автозагрузчик вызовет Doctrine::autoload
, передавая ему имя класса в качестве параметра.
таким образом, я также могу зарегистрировать множество функций автозапуска ?
Да, вы можете, с spl_autoload_register
:
Если должно быть несколько автозагрузок функции,
spl_autoload_register()
допускает это.Он эффективно создает очередь функции автозагрузки, и проходит через каждый из них в порядке, в котором они определены.
Но обычно мы не определяем одну автозагрузочную функцию / метод для каждого имеющегося у нас класса ;я полагаю, это было бы довольно неэффективно.
Вместо этого мы используем имя класса, которое получает функция автозагрузки, чтобы решить, какой файл следует включить.
Например, функция автоматической загрузки может выглядеть следующим образом :
function my_autoloader($className)
{
require LIBRARY_PATH . '/' . $className . '.php';
}
Хитрость в том, что если ваши файлы названы в честь классов, которые они содержат, это сразу становится намного проще ;-)
Вот почему классы часто именуются с использованием соглашения PEAR : My_Class_Name
сопоставляет с файлом My/Class/Name.php
Другие советы
Все ваше утверждение верно.
spl_autoload_register
позволяет вам зарегистрировать несколько функций автоматической загрузки.В случае, если вы попытаетесь создать или использовать объект класса, который не был загружен в среду PHP, PHP запустит все ваши функции автозагрузки, ищущие этот класс.
Пример доктрины, который вы приводите, использует то, что называется обратный вызов зарегистрировать метод внутри класса.Обратный вызов - это просто массив, содержащий имя класса (для статических методов) или экземпляр этого класса (для нестатических методов) и имя метода.
То, что говорят, правильно.Он вызывается, когда создается экземпляр неизвестного класса.Затем вы получаете возможность включить / запросить необходимый файл.
Когда функция находится в классе, вы должны передать ее в массив.В данном случае это статическая функция, потому что они передаются в классе Doctrine вместо экземпляра класса Doctrine.