Работает ли функция автозагрузчика PHP со статическими вызовами методов?
Я немного помню, что автозагрузка работала с new
заявление. Теперь, когда у меня есть несколько служебных классов, и я хочу их автозагрузить? И я использую только статические методы?
Подобно:
MathGuru::calculateFoo($bar);
Будет ли автозагрузка загружать MathGuru здесь? Или я должен включить это вручную?
6 ответов
Механизм автозагрузки работает со статическими классами точно так же, как и с нестатическими:
- Функция автозагрузки, которую вы зарегистрировали, будет вызвана
- Он получит название класса
- И он должен будет потребовать / включить необходимый код PHP
На самом деле автозагрузчик даже не должен "знать", вызывается ли он для загрузки статического или динамического класса, поскольку его роль заключается в загрузке кода PHP, содержащего определение класса, а не в его создании или создании чего-либо еще.
Да, это вызовет __autoload.
Это не просто "новый", который запускает автозагрузку - любая ссылка на неизвестный класс сделает это. Даже что-то вроде использования class_exists вызовет автозагрузчик (это не всегда желаемое поведение, поэтому у class_exists есть второй параметр для отключения автозагрузки)
Конечно, лучший и самый быстрый способ это попробовать?
Из документов нет ничего, что упоминает new
быть нужным
Цель автозагрузчика - загрузить class
всякий раз, когда это необходимо. Итак, если вашему клиентскому коду нужен класс, потому что вы хотите получить доступ к члену статического класса, и он еще не загружен, boom, он загружает его и переводит его в игру.
Логично, что первое, что должно сработать, это вызовы статических членов. Использование конструктора для создания экземпляра объекта обычно происходит после загрузки класса. Таким образом, статический регистр должен быть первым в вашем сердце (но есть слишком много книг и таких, которые недостаточно используют статические члены класса).:-)
У меня возник тот же вопрос, что и у исходного плаката, после автозагрузки классов, вызвав их статические методы, которые не работали. Я использовал Php 5.3.5 и придумал следующее решение.
function autoload($class_name) {
$directories = array(
'php/classes/',
'php/vendor/'
);
foreach ($directories as $directory) {
if (file_exists($directory . $class_name . '.php')) {
require_once($directory . $class_name . '.php');
return;
}
}
}
spl_autoload_register('autoload');
Обратите внимание spl_autoload_register
функция была использована вместо __autoload
который, кажется, был решением.
У меня была одна проблема с этим, когда очень незначительная синтаксическая ошибка дала довольно неясное сообщение об ошибке, где это выглядело как __autoload() не вызывается.
SomeClass:callStaticMethod(); // Doesn't call autoload for "SomeClass"
SomeClass::callStaticMethod(); // Successfully calls autoload for "SomeClass"
PHP странным образом интерпретирует единственное ":" (вместо правильного двойного "::") как ничто. Он обрабатывает callStaticMethod() как глобальный вызов метода, то есть пропускает __autoload.