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