【发布时间】:2013-02-20 11:53:02
【问题描述】:
我正在寻找一种方法来禁用 PHP 在项目中使用 include_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。
当然,您可以反对我所描述的设置,理由是它不应该出于其他原因发生。这还算公平。我可能会同意,甚至。例如,上述场景是一个向后不兼容的更改,这不是很好。
尽管如此,到目前为止,我已经看到它在野外发生过两次(在一个足够复杂的项目中,chroots 搅浑了水)并且它已经耗尽了无数个令人困惑的调试时间。 .我不想再有这个问题了。不在这种星座 - 或任何其他星座。
我不希望 PHP 神奇地尝试查找我的文件。我希望 PHP 要求我对要加载的文件具体。
为什么我不需要 include_path
使用__DIR__(或旧PHP 版本中的dirname(__FILE__)),语义“相对”路径很容易构建。如果我需要区分实时服务器和测试服务器,那么定义绝对位置的常量是我的朋友。
所以...我希望提供给include()(和相关函数)的非绝对路径失败。
This stackoverflow question from 2011 告诉我我不能空白include_path。是否有其他方法可以禁用该功能?我的 Googlefu 很弱,但我仍然怀疑答案是否定的(除非你修补 PHP 本身)。
如果有人知道我可以通过代码约定协议以外的方式阻止这种情况(或相关的“请不要使用include(),但我编写的这个自定义函数”) ,我很想知道。 :)
【问题讨论】:
-
并按照链接问题中的建议将其设置为不存在的路径?
-
@CarlosCampderrós:显然
.始终是include_path的一部分,无论您是否尝试删除它。 :( -
为什么会有问题?如果您将所有库安装在 docroot 中并仅使用绝对路径,那会解决您的问题吗?
-
@FritsvanCampen:是的——我确实只想使用绝对路径。我只是想让 PHP 拒绝非绝对路径,这样就不会发生上述情况。基本上,我想要一种将非绝对
include()s 标记为“错误”或至少作为“警告”的方法......让开发人员知道他们正在做的事情是不可接受的。代码约定在那里有很大帮助(这是我“解决”这个问题的当前方式),但有一个机制会更好。 -
您为什么还要编写自己的包含?我以为你提到了一些关于自动加载的事情。巧妙的自动加载将使您无需手动添加任何内容。您总是可以在版本控制系统的预提交挂钩上进行一些处理,以尝试查找相关包含并阻止提交,但这似乎更像是一个“文化”问题。
标签: php include-path