Требует ли PHP, require_once или включает автоматическое чтение файла при загрузке страницы?

У меня есть несколько страниц, которые используют языковые конструкции include или require в PHP. Многие из них лежат в операторах IF, ELSE.

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

1) уменьшить беспорядок кода на странице

2) не загружать файл, если не выполнено условие.

Загружает ли файл оператор include или require независимо (и, таким образом, устраняя преимущества, которых я пытался достичь, помещая в оператор if/else?

Краткий пример:

<?php


$i = 1

if($i ==1) {

      require_once('somefile.php');

} else {

     require_once('otherfile.php');
}

?>

При загрузке страницы оба файла проверяются и загружаются?


person JM4    schedule 12.03.2011    source источник


Ответы (4)


Если вы поместите оператор include/require в тело оператора if (или else), он будет выполнен, если условие if истинно.

if ($a == 10) {
    // your_first_file.php will only be loaded if $a == 10
    require 'your_first_file.php';
} else {
    // your_second_file.php will only be loaded if $a != 10
    require 'your_second_file.php';
}


И, если вы хотите, вы можете легко проверить это.
Этот первый пример:

if (true) {
    require 'file_that_doesnt_exist';
}

достанется вам:

Warning: require(file_that_doesnt_exist) [function.require]: failed to open stream: No such file or directory
Fatal error: require() [function.require]: Failed opening required 'file_that_doesnt_exist'

то есть require выполняется -- и терпит неудачу, так как файл не существует.


В то время как этот второй пример:

if (false) {
    require 'file_that_doesnt_exist';
}

Вы не получите никакой ошибки: require не выполняется.

person Pascal MARTIN    schedule 12.03.2011
comment
Хахахаха! Паскаль Мартин снова в деле - как всегда с превосходным и подробным вкладом. :) +1 за то, что показал, как это проверить - person Pekka; 13.03.2011

При загрузке страницы оба файла проверяются и загружаются?

Нет, по крайней мере, начиная с (IIRC) PHP 4.0.1.

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

person Pekka    schedule 12.03.2011
comment
Спасибо! Я просто не хотел тратить ненужные ресурсы и всегда задавался вопросом - person JM4; 13.03.2011
comment
Есть несколько веских причин против автозагрузки, большинство из которых связано с кешем байт-кода. - person ThiefMaster; 13.03.2011
comment
@ThiefMaster: я не понимаю ваших рассуждений (ну, их нет). Я использую APC с включенным кешем кода операции, и мои приложения обычно активно используют автозагрузку, но у меня никогда не было с этим проблем. Что я делаю неправильно? Что мне делать, чтобы получить проблемы? - person NikiC; 13.03.2011
comment
Я не помню, что именно вызвало это ... но я думаю, что читал об этом здесь, на SO, поэтому поиск может помочь. - person ThiefMaster; 13.03.2011
comment
Раньше автозагрузчики и кэши опкодов не ладили. В современном PHP это уже не так (поскольку был создан кеш реального пути), хотя плохо спроектированные автозагрузчики могут вызывать больше запросов файловой системы, чем это необходимо. - person Charles; 13.03.2011

Нет, будет загружен только один из этих файлов.

person dialer    schedule 12.03.2011

Конструкции include и require оцениваются только при передаче. Файлы читаются только тогда, когда выполняется ваше выражение.

Это просто объяснить, учитывая, что конструкции могут содержать переменные:

require_once("otherfile-{$i}.php");

Это поддерживается. Но он не может работать до того, как PHP перейдет к этой конкретной строке, потому что ему нужно знать состояние $i, чтобы загрузить нужный файл.

person mario    schedule 12.03.2011
comment
Надеюсь, кто-нибудь скопирует ваш скрипт и заменит {$i} на {$_GET['i']} :D (да, я злой, хе-хе) - person NikiC; 13.03.2011
comment
Ваши советы принесут вам неприятную загробную жизнь. - person mario; 13.03.2011
comment
О, кто знает. Вероятно, вам просто нужно сказать ' OR 1 -- прямо перед тем, как вас отправят в ад, и вы волшебным образом попадете в рай ;) +1 - person NikiC; 13.03.2011