include-path-在PHP中禁用include_path



我正在寻找一种方法来禁止PHP在项目中使用include_path

背景

也许你会感到惊讶:我为什么要阻止使用这样一个有用的功能?

不幸的是,虽然我认为答案很简单,但准确描述并不简单:

简而言之,include_path(显然)是包/库盲的。

更具体地说,可以将一个库的两个不同版本放入两个文件夹中,这两个文件夹都在include_path中,最终执行的代码是两者的混合。考虑以下设置:

include_path=/some/server/path/lib:
    /var/www/apache/htdocs/yourApplication/library

现在想象一下,您想要使用的库的规范位置在/some/server/path/lib中,您的构建过程将其放置在那里,但开发人员试图修补其中的一部分,并错误地将库同步到/var/www/apache/htdocs/yourApplication/library。现在想象一下:

/some/server/path/lib/moduleYouWant
    '--> A.php (old version)
/var/www/apache/htdocs/yourApplication/
    '--> SomeFile.php (uses B.php from module; previously used A.php)
/var/www/apache/htdocs/yourApplication/library/moduleYouWant
    '--> A.php (new version)
    '--> B.php (new file; uses A.php from module)

突然间,您的应用程序将神秘地使用或自动加载(如果您的自动加载器使用include_path,据我所知,大多数框架提供的自动加载器都是这样做的)您所做的更改中只有一半-新的B.php,但旧的A.php

当然,你可能会反对我所描述的设置,理由是出于其他原因,这种设置永远不应该发生。这很公平。我很可能会同意。例如,上面的场景是一个向后不兼容的更改,这不是很好。

尽管如此,到目前为止,我已经看到它在野外发生了两次(在一个足够复杂的项目中,chroot会搅乱水),它吞噬了无数混乱的调试时间。。。我不想再出现这种问题。不是在这种星座,也不是在任何其他星座。

我不希望PHP神奇地试图找到我的文件。我想让PHP要求我对加载哪些文件有特定的。

为什么我不需要include_path

使用__DIR__(或旧PHP版本中的dirname(__FILE__)),在语义上"相对"路径很容易构建。如果我需要实时和测试服务器的区别,那么定义绝对位置的常量就是我的朋友。

所以。。。我希望提供给include()(以及相关函数)的非绝对路径失败。

这个来自2011年的stackoverflow问题告诉我,我不能空白include_path。是否有其他方法可以禁用该功能我的Googlefu很弱,但尽管如此,我还是怀疑答案是"不(除非你自己修补PHP)"。

如果有人知道我可以通过代码约定协议(或相关的"请不要使用include(),但我写的这个自定义函数")来阻止这种情况,我很想知道。:)

您指出问题的根源是开发人员在应该使用的位置编写了错误的相对include,而不是使用绝对include或自动加载。

解决这一问题的办法不是技术性的,而是文化性的。您可以通过向版本控制系统添加预提交挂钩来强制执行正确的行为,该挂钩试图检测错误的include(相对include或仅所有include)并阻止提交。

只需使用以下内容:

set_include_path("./");

然后,当您需要将文件包含在当前文件夹之外时,您必须指定完全限定的相对或绝对路径

最新更新