仔细阅读评论
http://php.net/manual/en/function.set-include-path.php,在我看来,'。'或者更确切地说basename(__FILE__)
总是隐式添加到PHP的包含路径中。是否可以绕过这条道路?
在我的工作中,我使用自己的包装器和类加载器,我想控制PHP的include()的行为。我的包装器曾用于强制执行绝对路径,但我认为这实际上过于严格,我不想再回到原点。如果可能的话,我想使用PHP的include_path。
答案 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]);
}
}