1

我的代码中有以下行,它在 PHP-5.6 中运行良好,但在 PHP-7.1 中运行良好。

require_once '/app/plugin.php';

当我将其更改为以下之一时,它是否适用于 PHP-7.1?

require_once './app/plugin.php';

或者

require_once 'app/plugin.php';

第一行代码有什么问题?

4

2 回答 2

1

第一行代码有什么问题?

那么首先让我们注意它适用于 PHP 5.6(在您的设置中),而不适用于 7.x。所以不能完全错,只是说。

甚至你的报告也让我感到惊讶——以前从未经历过——这可能已经解释了一点并导致了解决方案。

即使在 PHP 5.6 中,使用引用 PHP 脚本本身目录的所谓魔术常量也是完全安全的。 __DIR__

这很方便,尤其是。对于相对包含/需要路径。

让我们举个例子:

require_once '/app/plugin.php';

是您当前的 (PHP 5.6) 代码。让我们利用__DIR__

require_once __DIR__ . '/app/plugin.php';

如果您可以确认它在 PHP 5.6 上工作,我的理解是,这个修改后的代码应该可以移植到 PHP 7 及更高版本(PHP 5.6 之后的下一个版本),因为它始终包含to-require脚本__DIR__的绝对(真实)路径,所以您可以使用它来安全地表达与其他文件的关系。


作为页边空白的注释:require_once也与realpath相关(如__DIR__),因此这是兼容的(在文件系统stat调用中只有一些开销,但我确信在此答案的上下文中可以忽略它们)。


再次:

第一行代码有什么问题?

至少在 PHP 7 及更高版本中,分辨率似乎对当前工作目录是正确的,这意味着 PHP 7+ 在绝对路径中查找文件:

/app/plugin.php

该文件很可能在该框中不存在。/是文件系统的根目录,任何以斜杠 ( ) 开头的/路径都是绝对路径。

也许(正如我个人从未经历过的那样)PHP 5.6可能是罪魁祸首,没有遵守关于什么构成和绝对或相对路径(前导斜杠)的 POSIX/UNIX/LINUX 约定。


我个人的建议:使用标准,前导斜杠 = 绝对路径。__DIR__为您在 PHP 中的利益使用。

于 2021-07-30T22:16:30.507 回答
0

我认为您在 PHP5 和 PHP7 中设置了不同的包含路径。运行get_include_path()并比较两个 PHP 版本的结果。

于 2017-02-22T10:41:44.793 回答