| |
нять имеющиеся переменные напрямую
он все же способен.
Работа с библиотекарем
Рассмотрим пример сценария, использующего библиотекарь в своей работе. Мы бу-
дем предполагать, что все модули размещены в подкаталоге /lib основного
каталога
Часть V. Приемы программирования на PHP
404
с Web-документами (если вы заметили, такой каталог уже есть в путях поиска
моду-
лей по умолчанию, "зашитых" в библиотекаре).
Пока мы будем подключать библиотекаря явно — инструкцией include. Ко-
нечно, это не очень удобно. Очень скоро мы узнаем, как избавиться от указан-
ного недостатка.
Пусть сценарию требуется библиотека files.phl, которую мы написали (или где-то
достали, хотя модули для PHP все еще большая редкость), и которая содержит
неко-
торые функции для работы с файлами.
Кстати, модулю files.phl самому могут понадобиться некоторые модули.
Если это так, нет проблем: достаточно лишь поставить вызов Uses() внутрь
кода библиотеки.
Листинг 29.2. Тестовый сценарий
include "$DOCUMENT_ROOT/lib/librarian.phl"; // подключаем библиотекарь
Uses("files"); // подключаем модуль files.phl
// Все — теперь можно использовать модуль
$Content=ReadAllFile("myfile.txt"); // читаем весь файл myfile.txt
$Hash=ReadKeyValFile("keyval.txt"); // читаем файл формата key=value
// ... и другие функции, которые, возможно, присутствуют в модуле
?>
Как видите, ничего сложного. Давайте теперь посмотрим, как выглядит модуль
files.phl.
Листинг 29.3. Пример модуля files.phl
// Внимание! Так указывается дополнительный каталог для поиска модулей.
// Запись означает, что библиотекарь должен искать модули также и в
// подкаталоге OtherModules/dk текущего каталога
$INC[]="OtherModules/dk";
// Подключение каких-то других модулей, в которых нуждается files.phl
Uses("SomeOtherModule");
Uses("AndOtherModuleToo");
Глава 29. Модульность программы. Написание "библиотекаря"
405
// Константа: символы перевода строки
define("CRLF",getenv("COMSPEC")?"\r\n":"\n");
// Читает все содержимое файла $fname и возвращает его
function ReadAllFile($fname)
{ $f=fopen($fname,"r"); if(!$f) return "";
$Cont=fread($f,1000000); fclose($f);
return $Cont;
}
// Читает файл $fname, строки которого имеют формат
// ключ1=значение1
// Возвращает ассоциативный массив с указанными в файле ключами
function ReadKeyValFile($fname)
{ $Cont=@File($fname); if(!@is_array($Cont)) return array();
$Hash=array();
foreach($Cont as $i=>$st) {
if(!ereg("^([^=]+)=(.*)",$st,$regs)) continue;
$Hash[trim($regs[1])]=trim($regs[2]);
}
return $Hash;
}
?>
Автоматическое подключение
библиотекаря
Из листинга 29.2 можно видеть, что пока нам не удалось полностью избавиться от
указания абсолютного пути к библиотекам. Вот строка, которая мне не нравится:
include "$DOCUMENT_ROOT/lib/librarian.phl"; // подключаем библиотекарь
Действуя привычным способом, нам придется вставлять ее в каждый сценарий, кото-
рый планирует использовать библиотекаря. Этих сценариев может быть довольно
много, так что если мы вдруг захотим изменить lib на, скажем, ../libraries, то
придется править все программы. По закону Мэрфи где-нибудь да ошибетесь — обя-
зательно. А значит, такое решение нам, как дотошным программистам, не подходит.
К счастью, существует еще по крайней мере два способа решить проблему с
абсолют-
ными путями, и который из них выбрать — зависит от ситуации.
Часть V. Приемы программирования на PHP
406
Здесь я хочу оговориться: разумеется, где-то все равно придется задать путь
к библиотекарю, но такое место будет только одно, поэтому в случае нужды
его легко модифицировать.
Способ первый: использование
auto_prepend_file
Как следует из Приложения 2, PHP опирается при выполнении сценариев на специ-
альный файл конфигурации под названием php.ini, в котором хранится большинст-
во его настроек, заданных в виде директив. Кроме того, если PHP установлен как
модуль Apache (а именно так обстоит дело у большинства хостинг-провайдеров),
не-
которые директивы можно также включать прямо в файлы .htaccess, управляющие
рабо
|
|