Вот что у нас получится в результате:
Листинг 29.1. Библиотекарь: librarian.phl
<?if(!defined("LIBRARIAN_LOADED")) {
define("LIBRARIAN_LOADED",1);
// Расширение библиотечных файлов по умолчанию
define("LibExt","phl");
// Пути поиска библиотек. Если начинаются с точки, то поиск
// ВСЕГДА ведется относительно текущего каталога, даже если его
// сменят, в противном случае при следующем вызова Uses() будет
// выполнен перевод пути в абсолютный.
$INC=array(".","./lib");
// Функция преобразует указанный относительный путь в абсолютный.
// Если путь уже является абсолютным (т. е. отсчитывается от корневого
// каталога системы), то с ним ничего не происходит, в противном случае
// используется имя текущего каталога (или заданного в $cur) с
// необходимыми преобразованиями. Существование файла с полученным полным
// именем не проверяется. Функция лишена некоторых недостатков
// встроенной в PHP realpath() и имеет по сравнению с ней несколько
// большие возможности, работая, правда, чуть медленнее.
function GetAbsPath($name,$cur="") { return abs_path($name,$cur); }
function abs_path($name,$cur="")
{ // Преобразуем обратные слэши в прямые
$name=strtr(trim($name),"\\","/");
// Сначала разбиваем путь по знакам "/"
$Parts=explode("/",$name);
$Path=($cur===""?getcwd():$cur); // начальный каталог поиска
foreach($Parts as $i=>$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;