【问题标题】:PHP require_once two files with the same namePHP require_once 两个同名文件
【发布时间】: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 answerthis answerthis answerthis answer(只有第一部分匹配)。
  • 如果文件位于不同的目录中,那么您应该将完整的目录路径放入 require 调用中。
  • 另外,您不应将 require(或 include)值括在括号中。行情就够了
  • 如果您需要有关如何解决问题的更多详细信息,请编辑您的问题并显示相关文件的目录树(包括调用require 的文件)和域的文档根目录

标签: php


【解决方案1】:

假设您的 htdocs 目录是您的 PHP $_SERVER['DOCUMENT_ROOT'] 位置,那么您可以使用更好的特异性简单地包含文件。

您不仅需要指定您想要的文件,还需要指定文件的确切位置

所以;从您的编辑中显示您的文件树:

requice_once $_SERVER['DOCUMENT_ROOT']."/phpbb/config.php";
...
require_once $_SERVER['DOCUMENT_ROOT']."/B/something.php";

那么“something.php”也有

require_once $_SERVER['DOCUMENT_ROOT']."/B/config.php";

注意事项

  • 不应将 includerequire 值括在括号中。
  • 您不应使用相对路径.. 等),始终提供绝对文件路径。
  • 一般情况下,尽量避免使用 _once 函数,它们是繁重的,而且内存昂贵,您可能不需要它们(特别是如果您绝对在寻找路径)
  • 即使$_SERVER['DOCUMENT_ROOT'] 不是适合您情况的确切解决方案,您也可以采用此处给出的概念并相应地应用它。

【讨论】:

  • 谢谢马丁,你回答的唯一问题是包含“/phpbb/config.php”的代码是主 phpBB 包的一部分,并且在我的扩展被调用之前运行得更早 - 在换句话说,从我的角度来看,这部分代码是只读的。我只能修改扩展名(或者如果真的需要,“B”包)。在那种情况下你会如何处理它?
  • 那么“something.php”也有require_once $_SERVER['DOCUMENT_ROOT']."/B/config.php";
猜你喜欢
  • 2014-08-14
  • 2021-11-13
  • 2012-09-27
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多