Листинг 9.8. Библиотека wlib.php
<?
require "xllib.php";
Function LoadWDocument($filename) { . . . }
Function SaveWDocument($filename,$doc) { . . . }
?>
Эти две библиотеки стали настолько популярны в среде Web-программистов, что скоро все стали их внедрять в свои программы. При этом, конечно же, никому нет дела до того, как эти библиотеки на самом деле устроены — все просто подключают их к своим сценариям при помощи require, не задумываясь о возможных последствиях.
Но в один прекрасный день одному неизвестному программисту потребовалось работать и с документами Word, и с документами Excel. Он, не долго думая, подключил к своему сценарию обе эти библиотеки (листинг 9.9):
Листинг 9.9. Подключение библиотек xllib.php
и wlib.php[E4]
<?
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() определяется второй раз, на что честно и прореагировал.