require_once在PHP 5.6中运行,但在PHP 7中不运行

时间:2017-02-22 10:34:00

标签: php php-7.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';

代码的第一行有什么问题?

提前致谢。

2 个答案:

答案 0 :(得分:0)

我认为你在PHP5和PHP7中设置了不同的包含路径。运行class Cell_Style: IEquatable<Cell_Style> { private Color cellColor; private Color fontColor; private int fontSize; private bool underline; private bool bold; private bool italic; public int FontSize { get => fontSize; set => fontSize = value; } public Color FontColor { get => fontColor; set => fontColor = value; } public Color CellColor { get => cellColor; set => cellColor = value; } public bool Underline { get => underline; set => underline = value; } public bool Bold { get => bold; set => bold = value; } public bool Italic { get => italic; set => italic = value; } public Cell_Style(Excel.Range cell) { cellColor = ColorTranslator.FromOle(Convert.ToInt32(cell.Interior.Color)); underline = (cell.Font.Underline == (int)Excel.XlUnderlineStyle.xlUnderlineStyleSingle) ? true : false; bold = cell.Font.Bold; fontColor = ColorTranslator.FromOle(Convert.ToInt32(cell.Font.Color)); fontSize = Convert.ToInt32(cell.Font.Size); italic = cell.Font.Italic; } //1st attempt bool IEquatable<Cell_Style>.Equals(Cell_Style other) { return Equals(other); } //2nd attempt bool IEquatable<Cell_Style>.Equals(Cell_Style other) { if (other.Bold == bold && other.CellColor == cellColor && other.FontColor == fontColor && other.FontSize == fontSize && other.Underline == underline && other.Italic == italic) { return true; } else { return false; } } } 并比较两个PHP版本的结果。

答案 1 :(得分:0)

<块引用>

代码的第一行有什么问题?

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

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

即使在 PHP 5.6 中,使用所谓的 Magic Constant __DIR__ 也是完全安全的,它指的是 PHP 脚本本身的目录。

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

举个例子:

require_once '/app/plugin.php';

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

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

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


<块引用>

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


再次:

<块引用>

代码的第一行有什么问题?

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

/app/plugin.php

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

也许(如我所写,我个人从未经历过这种情况)PHP 5.6 可能是不遵守 POSIX/UNIX/LINUX 关于什么构成以及绝对或相对的约定的罪魁祸首路径(前导斜杠)。


我的个人建议:使用标准,前导斜杠=绝对路径。使用 __DIR__ 为您的 PHP 带来好处。

相关问题