我正在寻找一种方法来禁用 PHPinclude_path
在项目中的使用。
背景
也许你会惊讶:我为什么要阻止使用这样一个有用的功能?
不幸的是,虽然我认为答案很简单,但要准确描述并不容易:
简而言之,include_path
是(显然)package-/library-blind。
更具体地说,可以将库的两个不同版本放入两个文件夹中,这两个文件夹都在 中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__
(或dirname(__FILE__)
在较旧的 PHP 版本中),语义上的“相对”路径很容易构建。如果我需要区分实时服务器和测试服务器,那么定义绝对位置的常量是我的朋友。
include()
所以...我希望提供给(和相关函数)的非绝对路径失败。
这个 2011 年的 stackoverflow 问题告诉我,我不能留空include_path
。是否有其他方法可以禁用该功能?我的 Googlefu 很弱,但我仍然怀疑答案是否定的(除非你修补 PHP 本身)。
如果有人知道我可以通过代码约定协议(或相关的“请不要使用include()
但我编写的这个自定义函数”)以外的方式阻止这种情况,我很想知道。:)