| |
ная переменная окружения), которая, как мы
знаем, в Windows-версии PHP содержит не то значение, которое мы ожидаем.
r И еще нам хочется, чтобы на момент загрузки модуля текущий каталог сменялся
на тот, в котором расположен файл модуля. Таким образом, стартовая часть биб-
лиотеки всегда сможет определить, где она находится, — например, при помощи
вызова getcwd().
Вот что у нас получится в результате:
Листинг 29.1. Библиотекарь: librarian.phl
$s) if($s!=".") {
// Признак корневого каталога?
if(!$i && (strlen($s)>1&&$s[1]==":"||$s=="")) $Path=$s;
// Ссылка на родительский каталог?
elseif($s=="..") {
// Если это уже корневой каталог, то куда спускаться?..
if(strlen($Path)>1 && $Path[1]==":") continue;
// Иначе используем dirname()
$p=dirname($Path);
if($p=="/"||$p=="\\"||$p==".") $Path=""; else $Path=$p;
}
// Иначе просто имя очередного каталога
elseif($s!=="") $Path.="/$s";
}
return ($Path!==""?$Path:"/");
}
// Преобразует URL в абсолютный файловый путь.
// Т. е. если адрес начинается со слэша, то результат рассматривается
// по отношению к каталогу DOCUMENT_ROOT, а если нет — то относительно
// dirname($SCRIPT_NAME). Конечно, функция не безупречна (например, она
// не умеет обрабатывать URL, заданные Alias-директивами Apache, но в
// большинстве случаев это и не нужно.
Глава 29. Модульность программы. Написание "библиотекаря"
401
function Url2Path($name)
{ $curUrl=dirname($GLOBALS["SCRIPT_NAME"]);
$url=abs_path(trim($name),$curUrl);
return getenv("DOCUMENT_ROOT").$url;
}
// Превращает все пути в списке $INC в абсолютные, однако делает это
// не каждый раз, а только если массив изменился с момента последнего
// вызова.
function AbsolutizeINC()
{ global $INC;
static $PrevINC=""; // значение $INC при предыдущем входе
// Сначала проверяем — изменился ли $INC. Если да, то преобразуем
// все пути в массиве в относительные, иначе ничего не делаем.
// Нам это нужно только из соображений повышения производительности
// функции.
if($PrevINC!==$INC) {
// Мы не можем использовать foreach, т. к. нам надо
// модифицировать массив
for($i=0; $i
|
|