Можно ли исключить "." (т.е. текущий каталог) из пути включения PHP?
Из просмотра комментариев на http://php.net/manual/en/function.set-include-path.php, мне кажется, что ".", Или, скорее, basename(__FILE__)
, всегда неявно добавляется к пути включения PHP. Можно ли вообще обойти этот путь?
В своей работе я использую собственный загрузчик include и class, и я хотел бы контролировать поведение PHP include(). Мое включение включало абсолютные пути, но я думаю, что это действительно слишком ограничительно, и я не хотел бы возвращаться к этому. Я хотел бы поработать с PHP include_path, если это вообще возможно.
2 ответа
Это невозможно. В документации include() говорится: "... include(), наконец, проверит собственный каталог вызывающего скрипта и текущий рабочий каталог перед сбоем"
Хорошо, я убежден.
Решение моей проблемы состоит в том, чтобы повторить 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]);
}
}