Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка PHP 2008.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

4.3 Инструкции включения

Инструкция require. Эта инструкция позволяет разбить текст программы на несколько файлов:

require имя_файла;

При запуске (именно при запуске, а не при исполнении!) программы интерпретатор заменит инструкцию на содержимое файла имя_файла (этот файл может также содержать сценарий на РНР, обрамленный, как обычно, тэгами <? и ?>). Причем сделает он это только один раз (в отличие от include): а именно, непосредственно перед запуском программы. Эта инструкция используется например, для включения в вывод сценария «шапок» с HTML-кодом.

<?

require "header.htm";

. . . работает сценарий и выводит само тело документа

require "footer.htm";

?>

Инструкция include. Эта инструкция практически идентична require, за исключением того, что включаемый файл вставляется тело сценария не перед его выполнением, а прямо во время.

Пусть у нас есть 10 текстовых файлов с именами file0.php, file1.php и так далее до file9.php, содержимое которых просто десятичные цифры 0, 1 ... 9 (по одной цифре в каждом файле). Запустим такую программу:

for($i=0; $i<10; $i++)

{

include "fiie$i.php";

}

В результате получим вывод, состоящий из 10 цифр: «0123456789». Каждый из файлов был включен по одному разу прямо во время выполнения цикла!

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

Трансляция и проблемы с include. Перед исполнением РНР транслирует программу во внутреннее представление. Это означает, что в памяти создается как бы «полуфабрикат», из которого исключены все комментарии, лишние пробелы, некоторые имена переменных и т.д. Впоследствии это внутреннее представление интерпретируется (выполняется). Однако в программе могут встретиться такие места для интерпретатора, которые РНР не сможет оттранслировать заранее. В этом случае он их пропускает, чтобы в момент, когда управление дойдет до определенной точки, опять запустить транслятор.

Одним из таких мест и является инструкция include. Как только управление программы доходит до нее, РНР вынужден приостановиться и ждать, пока транслятор не оттранслирует код включаемого файла. А это достаточно отрицательно сказывается на быстродействии программы. Поэтому, если вы пишете большой и сложный сценарий, применяйте инструкцию require вместо include, где только можно.

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

Инструкции однократного включения. В больших и непростых сценариях инструкции include и require применяются очень и очень часто. Поэтому становится довольно сложно контролировать, как бы случайно не включить один и тот же файл несколько раз. Для этого используются инструкции include_once и require_once.

Инструкция require_once работает точно так же, как и require, но за одним важным исключением. Если она видит, что затребованный файл уже был ранее включен, то она ничего не делает. Такой метод работы требует от РНР хранения полных имен всех подсоединенных файлов где-то в недрах интерпретатора. Инструкция include_once работает совершенно аналогично, но включает файл во время исполнения программы, а не во время трансляции.

Замечание. В РНР существует внутренняя таблица, которая хранит полные имена всех включенных файлов. Проверка этой таблицы осуществляется инструкциями include_once и require_once. Однако добавление имени включенного файла производят также и функции require и include. Поэтому, если какой-то файл был востребован, например, по команде require, а затем делается попытка подключить его же, но с использованием require_once, то последняя инструкция просто проигнорируется.