If
While
Do..while
For
Foreach
Break
Continue
Switch
Альтернативный синтаксис представления управляющих структур
Declare
Require
Include
Require_once()
lnclude_once()
Оператор require_once() приводит к замещению себя указанным файлом аналогично директиве препроцессора Си #include, и в этом отношении его работа
практически аналогична оператору requiге(). Но есть и одно важное отличие.
Использование requi re_once() гарантирует, что внешний файл будет подключен (и выполнен) только один раз, что позволяет избежать накладок с повторным
объявлением переменных или определениями функций и классов.
Предположим, например, что мы создали включаемый файл tea.inc и основной
библиотечный файл tealib.inc:
<?php
# /examaples/php/part2/tea.php
define(PHPVERSION, floor(phpversion()));
echo "Свободу глобальным переменным!<р>";
function goodTea() {
. return "Хор-р-роший краснодарский!";
}
?>
Выше я привел содержимое включаемого файла, в котором определяется версия
PHP-машины, выводится некоторое текстовое сообщение и определяется функция goodTea. Теперь мы используем этот файл в библиотеке tealib.inc:
<?php
# /examples/php/part2/tealib. inc
require ("tea.inc");
function showVar($var) {
if (PHPVERSION == 4) {
print_r($var) ;
} else {
var_ dump($var) ;
}
}
// здесь можно разместить объявления прочих функций, например:
function badCoffee() {
return "А кофеек-то так себе...";
}
?>
Теперь мы напишем заведомо неправильную программу, которая приведет к генерации сообщения об ошибке:
<titlе>0шибка при выполнении require</title>
<body bgcolor="#FFFFF0"><FONT SIZE=+1>
<?php
# /examples/php/part2/req-error.php
require("tealib.inc") ;
/* вот здесь -то ошибочка и всплывает. .. */
require ("tea. inc") ;
$foo = array("1" .array ("complex" ,"quaternion")) ;
echo "Результат работы <b>tea.inc</b>,". ,
" которая также требуется\n";
echo "в модуле <b>tealib.inc</b><br>";
echo "Вызываем goodTea: ".goodtea() ."<br>";
echo "Вывод переменной foo: --- ";
showVar($foo) ;
?>
В результате мы получим сообщение о попытке переопределения объявления функции goodieа (рис. 6.6).
Чтобы справиться с этой бедой, нам Достаточно слегка модифицировать tealib.inc
(назовем его tealib-c.inc) и использовать в нем вместо вызова require ( ) оператор
require_once(). Иначе говоря, необходимо поправить только одну строку:
...
require_once("tea.inc") ;
function showVar($var) {
Аналогичные правки внесем и в оснойную программу ( rеq- no - еrrоr;. рhp):
...
require_once("tealib-c.inc");
require_once("tea.inc");
$foo == array("1",array("complex","quaternion"))';
To, что мы увидим на экране после запуска этой программы, показано на рис. 6.7.
Рис. 6.6. Повторный вызов require приводит к генерации сообщения об ошибке
Рис. 6.7. Использование require_once предотвращает возникновение ошибок
Стоит обратить внимание, что, как и положено аналогу #i nclude из Си, этот оператор действует на этапе «компиляции», то есть во время анализа текста программы до начала ее выполнения. В том случае, если вам необходимо, чтобы содержимое внешнего файла динамически подставлялось во время исполнения программы,
вы должны использовать операторы include() (раздел 6.12) или include_once()
(раздел 6.14). См. также: require() (раздел 6.11), readfile() (раздел 10.5.3)и virtual () (раздел 15.3.6).
Оператор include_once() включает в тело вызывающей программы указанный
файл и интерпретирует его содержимое на этапе выполнения РНР-программы.
В целом работа этого оператора не отличается от include(), но применение
incl ude_once () гарантирует, что включение кода в программу будет производиться
ровно один раз.
Простой аналог подобной конструкции на Си выглядит (и интенсивно используется) следующим образом:
#1fndef _INDICATOR_
#define _1NDICATOR_
#inc1ude "tea.h" // Включаем заголовочный файл
здесь размещаются объявления констант, переменных и классов
#end1f
Точно так же, как и в случае с require_once (), этот оператор используется в ситуации, когда повторное включение одного и того же файла может привести к возникновению конфликтов. См. также: require() (раздел 6.11), include() (раздел
6.12), include_once() (раздел 6.14), readfilе() (раздел 10.5.3) и virtual () (раздел
15.3.6).
|