Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

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:\home\localhost\www\test1.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().


<< Предыдущий параграф Следующий параграф >>
Оглавление