是否可以排除'。' (即当前目录)来自PHP的包含路径?

时间:2010-12-26 14:54:53

标签: php include-path autoloader cwd

仔细阅读评论 http://php.net/manual/en/function.set-include-path.php,在我看来,'。'或者更确切地说basename(__FILE__)总是隐式添加到PHP的包含路径中。是否可以绕过这条道路?

在我的工作中,我使用自己的包装器和类加载器,我想控制PHP的include()的行为。我的包装器曾用于强制执行绝对路径,但我认为这实际上过于严格,我不想再回到原点。如果可能的话,我想使用PHP的include_path。

2 个答案:

答案 0 :(得分:3)

这是不可能的。在documentation of include()中说:“... include()最终将在调用脚本自己的目录和当前工作目录中检查失败”

答案 1 :(得分:0)

好的,我确信。

我的问题的解决方案是为每个包含的get_ini('include_path')迭代$fileName,转换为绝对路径并相应地处理。真的,对我的自定义包括类的最小更改。类加载器不需要任何更改。

感谢您的快速解答!

以下是我的includer类的相关更新方法: ($ 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]);
    }
}