5

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

在我的工作中,我使用自己的包含器和类加载器,并且我想控制 PHP 的 include() 的行为。我的包含器曾经强制执行绝对路径,但我认为这真的太限制性了,我不想恢复到那个状态。如果可能的话,我想使用 PHP 的 include_path。

4

2 回答 2

3

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

于 2010-12-26T15:09:31.450 回答
0

好吧,我深信不疑。

我的问题的解决方案是迭代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]);
    }
}
于 2010-12-26T15:29:55.530 回答