|
точно определенное место, то
воспользуйтесь require. В противном случае более удачным выбором будет
include.
Инструкции однократного включения
В больших и непростых сценариях инструкции include и require применяются
очень и очень часто. Поэтому становится довольно сложно контролировать, как бы
случайно не включить один и тот же файл несколько раз (что чаще всего приводит
к
ошибке).
Чтобы стало яснее, я расскажу вам притчу. Как-то раз разработчик Билл написал
не-
сколько очень полезных функций для работы с файлами Excel и решил объединить их
в библиотеку — файл xllib.php (листинг 9.7):
Листинг 9.7. Библиотека xllib.php
Function LoadXlDocument($filename) { . . . }
Function SaveXlDocument($filename,$doc) { . . . }
?>
Разработчик Вася захотел сделать то же самое для работы с документами Microsoft
Word, в результате чего на свет явилась библиотека wlib.php. Так как Word и
Excel
связаны между собой, Вася использует в своей библиотеке (листинг 9.8) возможно-
сти, предоставляемые библиотекой xllib.php — подключает ее командой require:
Листинг 9.8. Библиотека wlib.php
require "xllib.php";
Function LoadWDocument($filename) { . . . }
Function SaveWDocument($filename,$doc) { . . . }
?>
Эти две библиотеки стали настолько популярны в среде Web-программистов, что
скоро все стали их внедрять в свои программы. При этом, конечно же, никому нет
дела до того, как эти библиотеки на самом деле устроены — все просто подключают
Глава 9. Конструкции языка 165
их к своим сценариям при помощи require, не задумываясь о возможных последст-
виях.
Но в один прекрасный день одному неизвестному программисту потребовалось рабо-
тать и с документами Word, и с документами Excel. Он, не долго думая, подключил
к
своему сценарию обе эти библиотеки (листинг 9.9):
Листинг 9.9. Подключение библиотек xllib.php и wlib.php
require "wlib.php";
require "xllib.php";
$wd=LoadWDocument("document.doc");
$xd=LoadXlDocument("document.xls");
?>
Каково же было его удивление, когда при запуске этого сценария он получил
сообще-
ние об ошибке, в котором говорилось, что в файле xlib.php функция LoadXlDoc()
определена дважды!..
Что же произошло? Нетрудно догадаться, если проследить за тем, как транслятор
PHP
"разворачивает" код листинга 9.9. Вот как это происходит:
//require "wlib.php";
//require "xllib.php";
Function LoadXlDocument($filename) { . . . }
Function SaveXlDocument($filename,$doc) { . . . }
Function LoadWDocument($filename) { . . . }
Function SaveWDocument($filename,$doc) { . . . }
//require "xllib.php";
Function LoadXlDocument($filename) { . . . }
Function SaveXlDocument($filename,$doc) { . . . }
$wd=LoadWDocument("document.doc");
$xd=LoadXlDocument("document.xls");
Как видим, файл xllib.php был включен в текст сценария дважды: первый раз кос-
венно через wlib.php, и второй раз — непосредственно из программы. Поэтому
транслятор, дойдя до выделенной строки, обнаружил, что функция
LoadXlDocument() определяется второй раз, на что честно и прореагировал.
Конечно, разработчик сценария мог бы исследовать исходный текст библиотеки
wlib.php и понять, что во второй раз xllib.php включать не нужно. Но согласи-
тесь — это не выход. Действительно, при косвенном подключении файлов третьего и
выше уровней вполне могут возникнуть ситуации, когда без модификации кода биб-
лиотек будет уже не обойтись. А это недопустимо. Как же быть?
Часть III. Основы языка PHP 166
Что ж, после столь длительного вступления (возможно, слишком длите
|
|