Функция автозагрузчика PHP также работает со статическими вызовами метода?

Я немного помню, что autoload работал с new заявлением. Теперь как насчет того, когда у меня есть несколько классов полезности, и я хочу их загрузить? И я использую только статические методы?

Подобно:

 MathGuru::calculateFoo($bar); 

Здесь была бы загружена автозагрузка MathGuru? Или я должен включить его вручную?

Механизм автозагрузки работает точно так же, как и статические классы, которые он выполняет с нестационарным:

  • Вызов функции автозагрузки / метода, который вы зарегистрировали
  • Он получит имя класса
  • И он должен будет потребовать / включить необходимый PHP-код

Фактически, автозагрузчик даже не должен «знать», если он вызывается для загрузки статического или динамического класса, поскольку его роль заключается в загрузке кода 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 всякий раз, когда это необходимо. Итак, если вашему клиентскому коду нужен класс, потому что вы хотите получить доступ к статическому члену класса, и он еще не загружен, бум, он загружает его и помещает в игру.

Логически тогда первое, что должно работать, – это призывы к статическим членам. Использование конструктора для создания экземпляра объекта обычно происходит после загрузки класса. Итак, статический случай должен быть первым в вашем сердце (но слишком много книг и таких, что недоиспользовать статических членов класса). 🙂