Подтвердить что ты не робот

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

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

Как

MathGuru::calculateFoo($bar);

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

4b9b3361

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

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