Работает ли функция автозагрузчика PHP со статическими вызовами методов? - PullRequest
21 голосов
/ 11 января 2010

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

Как:

MathGuru::calculateFoo($bar);

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

Ответы [ 6 ]

20 голосов
/ 11 января 2010

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

  • Зарегистрированная функция / метод автозагрузки будет называться
  • Получит название класса
  • И для этого потребуется / включить необходимый код PHP


На самом деле, автозагрузчик даже не должен «знать», вызывается ли он для загрузки статического или динамического класса, поскольку его роль заключается в загрузке кода PHP, который содержит определение класса, а не в его создании или создании чего-либо еще.

6 голосов
/ 11 января 2010

Да, это вызовет __ автозагрузку .

Это не просто «новый», который запускает автозагрузку - любая ссылка на неизвестный класс сделает это. Даже что-то вроде использования class_exists вызовет автозагрузчик (это не всегда желательно, поэтому в class_exists есть второй параметр для отключения автозагрузки)

5 голосов
/ 11 января 2010

Конечно, лучший и самый быстрый способ - попробовать?

Из документов нет ничего, что упоминало бы о необходимости 1003 *. 1004 *

0 голосов
/ 10 января 2017

Цель автозагрузчика - загрузить class всякий раз, когда это необходимо. Итак, если вашему клиентскому коду нужен класс, потому что вы хотите получить доступ к члену статического класса, а он еще не загружен, boom, он загружает его и переводит его в игру.

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

0 голосов
/ 11 сентября 2014

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

0 голосов
/ 10 августа 2011

У меня была одна проблема с этим, когда очень незначительная синтаксическая ошибка дала довольно неясное сообщение об ошибке, где это выглядело как __autoload (), не вызывался.

SomeClass:callStaticMethod(); // Doesn't call autoload for "SomeClass"

SomeClass::callStaticMethod(); // Successfully calls autoload for "SomeClass"

PHP странным образом интерпретирует один ":" (вместо правильного двойного "::") как ничто. Он обрабатывает callStaticMethod () как глобальный вызов метода, то есть пропускает __autoload.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...