2

我正在寻找一种方法来禁用 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()但我编写的这个自定义函数”)以外的方式阻止这种情况,我很想知道。:)

4

2 回答 2

1

只需使用以下内容:

set_include_path("./");

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

于 2013-02-20T11:56:45.830 回答
1

您指出问题的根源是您让开发人员编写了错误的相对包含,他们应该使用绝对包含或自动加载。

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

于 2013-02-20T12:25:21.043 回答