我正在寻找一种方法来禁止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("./");
然后,当您需要将文件包含在当前文件夹之外时,您必须指定完全限定的相对或绝对路径