【发布时间】:2021-02-09 02:38:38
【问题描述】:
这是一个奇怪的情况...我正在尝试为 PHP 程序“A”创建一个扩展,它与另一个程序“B”集成。
这就是问题所在,“A”和“B”都有名为“config.php”的文件,其中包含它们的配置。那么会发生什么是脚本 A 有:
requice_once("config.php");
...
require_once("../B/something.php");
那么“something.php”也有
require_once("config.php");
这是一个不同的文件,因为它位于不同的目录中 - 但 PHP 没有注意到这一点,并且第二个文件不包括在内。
我设法找到了一个非常丑陋的解决方案来重命名第二个“config.php”以及对它的所有引用,但这显然会使维护变得痛苦......有没有更好的方法?
编辑-
好吧,也许我有点过于简单化了。 “A”实际上是“phpBB”,我正在为此编写一个扩展(我不想开始修改主程序,因为它会使维护难以忍受),所以我无法对代码进行任何更改这包括配置的第一个实例。我通过扩展给定的基类来实现 API,然后 phpBB 调用我的类的 __construct 方法,其中一个参数是 $phpbb_root_path,这是安装 phpBB 的目录。然后从扩展我这样做:
require_once($phpbb_root_path . "../B/something.php");
“B”是一个内部开发的包(尚未开源,所以我不能给出确切的文件名),这就是为什么我更容易将“config.php”重命名为“configuration.php”一个丑陋的修复。一切都在一个目录中。确切的树是
htdocs
| - phpbb
| |
| | - config.php
| | - ext/{long path}/myextension.php
|
| --- B
| | - config.php
| | - something.php
谢谢,对不起。
【问题讨论】:
-
chdir('../B');然后是 require,然后是chdir(dirname(__FILE__)); -
require_once("config.php");不会告诉 PHP 要包含的文件的位置(在这种情况下为config.php)。它有一些搜索规则,并且很可能在第二次调用时文件config.php解析为与第一次调用时相同的文件。因此 PHP 不再包含它。使用dirname()和__DIR__在这两个地方计算config.php的绝对路径,它将起作用。阅读this answer、this answer、this answer 和this answer(只有第一部分匹配)。 -
如果文件位于不同的目录中,那么您应该将完整的目录路径放入 require 调用中。
-
另外,您不应将
require(或include)值括在括号中。行情就够了 -
如果您需要有关如何解决问题的更多详细信息,请编辑您的问题并显示相关文件的目录树(包括调用
require的文件)和域的文档根目录
标签: php