PHP поведение include / require внутри условно - PullRequest
15 голосов
/ 11 октября 2010

Если я помещу оператор include или require в условное выражение, которое оценивается как false, интерпретатор PHP вообще пропустит файл включения или загрузит его на всякий случай?

Примером может быть:

if ($some_user_var) {
    require 'this.php';
} else {
    //do stuff
}

Я где-то читал, что require всегда будет включен интерпретатором независимо от условного, но include не будет. Если это так, то простое переключение с require на include может означать свободное ускорение из-за уменьшенного ввода-вывода и затрат на синтаксический анализ.

Вероятно, имеет значение, если я использую препроцессор, такой как eAccelerator, но давайте предположим, что нет.

Ответы [ 3 ]

25 голосов
/ 11 октября 2010

Будет включено только если условие истинно.Я не знаю, где вы читаете иначе, но они не правы.

Единственная разница между include и require заключается в том, что include выдаст предупреждение, если оно не получится, тогда как requireвыдаст фатальную ошибку.

Чтобы подтвердить это, см. страницу руководства PHP для require.

(ps - если вы делаете условные включения, в зависимости отна то, что причина, вы можете использовать include_once() или require_once() вместо)

1 голос
/ 29 февраля 2012

Я тоже где-то читал.Аргумент выглядит примерно так:

Если вы поместите условие вокруг включения, PHP не сможет узнать, требуется оно или нет, пока не начнет интерпретировать код и не сможет интерпретировать код доон получает все переменные и функции и, следовательно, файлы.Таким образом, он загружает все файлы независимо от условия, а затем удаляет их обратно из окончательной «компиляции».

Хотя, опять же, если вы оберните условие вокруг PHP-файла с ошибкой, оно не нарушит его.И если вы объявляете переменную во включаемом файле, а затем используете значение переменной, чтобы определить, включать ее или нет, она не получает ее значение:)

Возможно, раньше это было проблемой встарые версии PHP?

Я не проверял его в отношении скорости загрузки и использования оперативной памяти - но я бы хотел получить окончательный ответ на этот вопрос.Есть ли какие-либо накладные расходы, связанные с условными включениями?

1 голос
/ 11 октября 2010

Это не правильно.require не будет включать файлы, которые заключены в блоки, в которые они никогда не обращаются, интерпретатор php не игнорирует их.include и require не имеют практически никаких различий в производительности (в этом отношении они также не имеют большого отличия от _once, хотя это более важно).

...