13.24. Оператор require_once()
Оператор require_once() заменяет сам себя указанным файлом. Данный оператор работает наподобие директивы препроцессора #include в языке С и в этом отношении похож на принцип работы оператора require(). Основное отличие состоитвтом, что использование оператора require_once() обеспечит добавление кода к вашему сценарию только один раз и поможет избежать столкновений со значениями переменных или именами функций.
Продемонстрируем работу оператора require_once() на примере. Для этого сразу создадим пример с оператором require(), который будет выдавать ошибку, так как в данном примере мы хотели бы показать основные тонкости программирования с использованием оператора require_once(). Создадим два файла: testl. inc и test2.inc.
Пример 13.10. Файл testl.inc
<?php
echo "Работа файла testl. inc<br>n";
function goodTea() {
return "Проверка прошла успешно!";
}
?>
В данном примере вызывается файл testl.inc и сразу выполняется функция echo(), которая выводит строку «Работа файла test1.inc». Это сделано для того, чтобы вы смогли проследить, когда какой файл выполняется и какой из этого следует результат. При правильном написании дальнейшей программы выполняется функция goodTea(), которая возвращает результат — строку «Проверка прошла успешно».
Пример 13.11. Файл test2.inc
<?php
require("testl. inc");
echo "Вызов файла test2.inc<br>n";
?>
При вызове файла test2.inc сразу выполняется оператор require("test1.inc");, что опять переводит выполнение программы в файл test1.inc. После этого из файла test2. inc при правильном написании программы должна выполняться функция echo(), которая выводит строку «Вызов файла test2.inc». Далее создаем файл test3.php.
Пример 13.12. Файл test3.php
<?php
require("test2. inc");
/* все, что написано далее, сгенерирует ошибку */
require("testl.inc");
echo "Произошло полное выполнение программы <br>n" ; echo "Вызов всех файлов проделан успешно <br>n";
echo "Результат работы функции goodTea: " . goodTea() . "n";
?>
Выполнение данного файла сразупереводит компилятор в файл test2.inc, после этого из файла test2.inc управление передается в файл test1.inc, в котором и произойдет ошибка. Ошибка будет выглядеть следующим образом:
Работа файла test1.inc
Вызов файла test2.inc
Работа файла test1.inc
Fatal error: Cannot redeclare goodtea() in z:homelocalhostwwwtest1.inc on line 3
В начале программа будет выполняться по установленному плану, но потом произойдет ошибка при обращении к функции goodTea. Данная ошибка говорит о том, что интерпретатор РНР не может повторно объявить функцию, которая была ранее объявлена. Для устранения данной ошибки предлагаем переписать код программы примера 13.11 следующим образом:
<?php
require_once("test1.inc");
echo "Вызов файла test2.inc<br>n"
?>
Пример 13.12.
<?php
require_once("test2.inc");
/* все, что написано далее, сгенерирует ошибку */
require_once("test1.inc");
echo "Произошло полное выполнение программы<br>n"; echo "Вызов всех файлов проделан успешно <br>n";
echo "Результат работы функции goodTea: " .goodTea () . "n";
?>
Изменению подверглись следующие операторы:
require("testl.inc") — require_once("testl.inc")
require("test2.inc") — require_once("test2.inc")
После выполнения программы с этими изменениями получим следующий результат:
Работа файла test1.inc
Вызов файла test2.inc
Произошло полное вьшолнение программы
Вызов всех файлов проделан успешно
Результат работы функции goodTea: Проверка прошла успешно
Как видно, ошибок нет.
СОВЕТ
Аналогично поведению директивы препроцессора flinclude языка С, require_once() работает в процессе компиляции, т. е. в момент времени, когда происходит анализ самого сценария, прежде чем произойдет его выполнение. Данный оператор не должен применяться для частей скрипта, которые должны вставляться динамически в течение его выполнения. Для этой операции лучше пользоваться такими операторами, как include_once() или include().