Функция автозагрузчика PHP также работает со статическими вызовами метода?
Я немного помню, что автозагрузка работала с оператором new
. Теперь как насчет того, когда у меня есть несколько классов полезности, и я хочу их загрузить? И я использую только статические методы?
Как
MathGuru::calculateFoo($bar);
Будет ли автозагрузка загрузки MathGuru здесь? Или я должен включить его вручную?
Ответы
Ответ 1
Механизм автозагрузки работает точно так же, как со статическими классами, которые он выполняет с нестационарным:
- Функция автозагрузки/метод, который вы зарегистрировали, будет называться
- Он получит имя класса
- И он должен будет потребовать/включить нужный PHP-код
Фактически, автозагрузчик даже не должен "знать", если он вызывается для загрузки статического или динамического класса, поскольку его роль заключается в загрузке кода PHP, который содержит определение класса, а не его экземпляре или что-то еще.
Ответ 2
Да, это вызовет __ autoload.
Это не просто "новый", который запускает автозагрузку - любая ссылка на неизвестный класс сделает это. Даже что-то вроде использования class_exists запускает автозагрузчик (это не всегда желательно поведение, поэтому у class_exists есть второй параметр, чтобы отключить автозагрузку)
Ответ 3
Конечно, лучший и самый быстрый способ - попробовать?
Из документов ничего не говорится о необходимости new
.
Ответ 4
У меня была одна проблема с этим, когда очень незначительная ошибка синтаксиса дала довольно неясное сообщение об ошибке, где оно выглядело как __autoload() не вызывалось.
SomeClass:callStaticMethod(); // Doesn't call autoload for "SomeClass"
SomeClass::callStaticMethod(); // Successfully calls autoload for "SomeClass"
PHP странно интерпретирует сингл ":" (вместо правильного двойного "::" ) как ничего. Он обрабатывает callStaticMethod() как глобальный вызов метода, то есть он пропускает __autoload.
Ответ 5
У меня был тот же вопрос, что и исходный плакат после автозагрузки классов, вызвав их статические методы, не работал. Я использовал 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');
Примечание: вместо __autoload
использовалась функция spl_autoload_register
, которая, по-видимому, была решением.
Ответ 6
Целью автозагрузчика является загрузка class
всякий раз, когда это необходимо. Итак, если вашему клиентскому коду нужен класс, потому что вы хотите получить доступ к статическому члену класса, а он еще не загружен, бум, он загружает его и помещает в игру.
Логически тогда первое, что должно работать, - это призывы к статическим членам. Использование конструктора для создания экземпляра объекта обычно происходит после загрузки класса. Итак, статический случай должен быть первым в вашем сердце (но слишком много книг и таких, что недоиспользовать статических членов класса).: -)