我正在寻找一种方法来禁用PHP在项目中使用include_path
。
也许你会感到惊讶:为什么我要阻止使用这样一个有用的功能呢?
不幸的是,虽然我认为答案很简单,但准确描述并不简单:
简而言之,include_path
(显然)是封装/库盲。
更具体地说,可以将两个不同版本的库放入两个文件夹中,这两个文件夹都位于include_path
中,最后是执行的代码,这两个文件夹都是混合 。请考虑以下设置:
include_path=/some/server/path/lib:
/var/www/apache/htdocs/yourApplication/library
现在假设您要使用的库的规范位置在/some/server/path/lib
中,并且您的构建过程将其放在那里,但是开发人员正在尝试修补其中的一部分并错误地将库同步到{{1 }}。现在想象一下这种情况发生了:
/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
混淆了水)并且它被吃掉了无数混乱的调试时间......我不想再遇到那个问题了。不是在这种星座 - 或任何其他星座。
我不希望PHP神奇地试图找到我的文件。我希望PHP要求我特定关于要加载哪些文件。
使用chroot
(或旧的PHP版本中的__DIR__
),语义'相对'路径很容易构建。如果我需要实时和测试服务器的区别,定义绝对位置的常量是我的朋友。
所以...我希望提供给dirname(__FILE__)
(和相关函数)的非绝对路径失败。
This stackoverflow question from 2011告诉我,我无法删除include()
。是否有其他方法可以禁用该功能?我的Googlefu很弱,但我仍然怀疑答案是'不(除非你修补PHP本身)'。
如果有人知道某种方式,我可以通过代码约定协议(或相关的“请不要使用include_path
,但我写的这个自定义函数)阻止此“),我很想知道。 :)
答案 0 :(得分:1)
只需使用以下内容:
set_include_path("./");
然后当您需要在当前文件夹之外包含文件时,您必须指定完全限定的相对路径或绝对路径
答案 1 :(得分:1)
你指出问题的根源在于你让开发人员编写坏的亲戚包括应该使用绝对包含或自动加载的地方。
解决这个问题不是技术问题,而是文化问题。您可以通过向版本控制系统添加pre-commit-hook来强制执行正确的行为,该版本系统尝试检测错误的包含(相对包含或仅包括所有包含)并阻止提交。