Работает ли функция автозагрузчика 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.

Другие вопросы по тегам