Можно ли исключить «.» (т.е. текущий каталог) из пути включения PHP? - PullRequest
5 голосов
/ 26 декабря 2010

от просмотра комментариев на http://php.net/manual/en/function.set-include-path.php, мне кажется, что '.', А точнее basename(__FILE__), всегда неявно добавляется в путь включения PHP. Можно ли вообще обойти этот путь?

В своей работе я использую свой собственный загрузчик include и class, и я хотел бы контролировать поведение PHP include (). Мое включение включало абсолютные пути, но я думаю, что это действительно слишком ограничительно, и я не хотел бы возвращаться к этому. Я хотел бы поработать с PHP include_path, если это вообще возможно.

Ответы [ 2 ]

3 голосов
/ 26 декабря 2010

Это невозможно.В документации о include () говорится: «... include (), наконец, проверит собственный каталог вызывающего скрипта и текущий рабочий каталог перед сбоем»

0 голосов
/ 26 декабря 2010

Хорошо, я убежден.

Решение моей проблемы состоит в том, чтобы перебрать get_ini('include_path') для каждого включенного $fileName, преобразовать в абсолютные пути и обработать соответствующим образом.Минимальные изменения в моем обычном включающем классе, правда.Загрузчик классов не потребует никаких изменений.

Спасибо за ваши быстрые ответы!

Ниже приведены соответствующие обновленные методы из моего класса включения: ($ this-> includePath инициализируется для get_ini ('include_path '))

// Pre-condition for includeFile()
// checks if $fileName exists in the include path

public function mayIncludeFile($fileName)
{
    if(array_key_exists($fileName, $this->includeMap))
    {
        return TRUE;
    }

    if($fileName{0} == DIRECTORY_SEPARATOR)
    {
        if(is_file($fileName))
        {
            $this->includeMap[$fileName] = $fileName;
            return TRUE;
        }
    }
    else foreach($this->includePath as $index => $path)
    {
        $absoluteFileName = $path . DIRECTORY_SEPARATOR . $fileName;
        if(is_file($absoluteFileName))
        {
            $this->includeMap[$fileName] = $absoluteFileName;
            return TRUE;
        }
    }

    return FALSE;
}

public function includeFile($fileName)
{
    $this->validateFileName($fileName, TRUE);
    if((array_key_exists($fileName, $this->includeMap) && $this->includeMap[$fileName]) ||
        $this->mayIncludeFile($fileName))
    {
        include_once($this->includeMap[$fileName]);
    }
}
...