PHP-4 Эффективная работа


If
While
Do..while
For
Foreach
Break
Continue
Switch
Альтернативный синтаксис представления управляющих структур
Declare
Require
Include
Require_once()
lnclude_once()

6.13. Require_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).

6.14. lnclude_once()

Оператор 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).

назад
далее

Сайт управляется системой uCoz