Автозагрузка PHP 5 неэффективна? - PullRequest
4 голосов
/ 07 марта 2012

Когда вы вручную включаете класс PHP, вы можете делать это во время работы текущего скрипта, верно? Затем вы можете решить, соответствует ли условие, загружаете ли вы его, а если нет, то нет. Как это:

if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) {
    include '../../../Whatever/SanitizeUserInput.class.php';
    SanitizeUserInput::sanitize($_POST['someFieldName']);
}

Но, скажем, я использую функцию автозагрузка с этим классом. Будет ли он эффективно загружен в начале или будет загружен, только если он используется?

Я имею в виду, стоит ли добавлять функцию __autoload только в те классы, которые я на 100% уверен, что буду использовать в любом сценарии ( например подключение к базе данных, управление сеансами и т. Д.)

Спасибо

Ответы [ 3 ]

6 голосов
/ 07 марта 2012

Автозагрузка вызывается только при попытке доступа к нужному классу. И было бы лучше использовать spl_autoload_register() вместо __autoload

Документация:

Вы можете определить функцию __autoload (), которая вызывается автоматически в случае, если вы пытаетесь использовать класс / интерфейс, который не был еще не определено.

и

spl_autoload_register () предоставляет более гибкую альтернативу для автозагрузка классов. По этой причине использование __autoload () не рекомендуется и может быть признан устаревшим или удален в будущем.

4 голосов
/ 07 марта 2012

Автозагрузка включается, когда вы пытаетесь использовать класс, который еще не был загружен:

include 'foo.php';
new Foo;  // autoload not used, because the class already exists

// Bar is not yet loaded here, auto or otherwise

new Bar; // Bar is being autoloaded, because it was not yet loaded

Таким образом, автозагрузка может быть очень эффективной.,Это немного менее эффективно, чем загрузка классов вручную в тот момент, когда они вам нужны, из-за накладных расходов при вызове функции автозагрузки.Но отследить загруженные классы вручную - это больше работы для очень небольшого возврата по сравнению с автозагрузкой.

2 голосов
/ 07 марта 2012

Попробуйте, вы увидите, что всякий раз, когда PHP сталкивается с классом, которого он еще не знает, он будет вызывать вашу функцию автозагрузки. Когда ваша функция автозагрузки сообщает PHP, в каком файле находится класс, она загрузит этот файл.

Короче говоря, PHP загружает файл только при необходимости, это верно даже для условий, поэтому следующий тестовый класс никогда не будет загружен.

if (false)
{
  $test = new CTest(); // never loaded with autoload.
}
...