2012-03-07 2 views
4

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

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

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

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

Благодаря

+0

бы с @Timur предложение использовать [spl_autoload_register] (http://www.php.net/manual/en/function.spl-autoload-register.php), как это кажется более гибким и от моего в перспективе я не понимаю, почему автозагрузка должна быть менее эффективной ... идея заключается в загрузке класса только тогда, когда экземпляр создается на основе вашей пользовательской логики ... так что вам должно быть хорошо с ним. – optimusprime619

+0

Использование автозагрузки или нет вопрос чистого дизайна. – KingCrunch

+1

@KingCrunch - Какой, по-вашему, чистый? – martinstoeckli

ответ

6

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

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

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

и

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

4

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

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

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

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

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