【问题标题】:PHP behavior of include/require inside conditional条件内包含/要求的 PHP 行为
【发布时间】:2011-04-23 19:50:06
【问题描述】:

如果我将 includerequire 语句放在计算结果为 false 的条件中,PHP 解释器会完全跳过包含文件,还是会加载它以防万一?

一个例子是:

if ($some_user_var) {
    require 'this.php';
} else {
    //do stuff
}

我在某处读到require 将始终被解释器包含,而不管条件如何,但include 不会。如果是这种情况,仅仅从require 切换到include 可能意味着由于减少了 I/O 和解析开销而可以免费加速。

如果我运行像 eAccelerator 这样的预处理器可能会有所不同,但假设我没有。

【问题讨论】:

  • 我认为你在某处读到的内容是这样的:require 将中止执行并出现致命错误,而include 不会(当然是失败)。可以解释为require 将始终包含您的文件,否则脚本将死。
  • 您有这本书吗? amazon.co.uk/PHP-World-Wide-Web-Quickstart/dp/0321245652我也被灌输了这个谎言!

标签: php performance include conditional


【解决方案1】:

这是不正确的。 require 不会包含包裹在从未调用过的块中的文件,php 解释器不会忽略它们。 includerequire 在性能方面几乎没有差异(就此而言,它们与 _once 也没有太大差异,尽管它更重要)。

【讨论】:

    【解决方案2】:

    仅当条件为真时才会包含它。我不知道你从哪里读到的,但他们错了。

    includerequire 之间的唯一区别是include 在失败时会抛出警告,而require 会抛出致命错误。

    要确认这一点,请参阅the PHP manual page for require

    (ps - 如果您正在执行条件包含,取决于原因,您可以考虑使用 include_once()require_once() 代替)

    【讨论】:

    • IIRC,他所描述的行为在 PHP 4.something 之前一直是这种情况。
    • 哦,我实际上是在使用require_once,我只是为了这个问题而简化了。不过谢谢
    • 感谢您提供指向手册页的链接。来自其中一个 cmets:“从 PHP 4.02 起,手册状态需要和 require_once 如果不应该执行该文件所在的代码行,则不再调用该文件”。完美:)
    • @Pekka - 我很确定 PHP4 也不是这种情况。 edit 是的,我刚发帖就知道了:)
    【解决方案3】:

    我也在某个地方读到过。论点是这样的:

    如果您在包含周围添加条件,PHP 无法知道它是否需要,直到它开始解释代码并且它无法解释代码,直到它掌握所有变量和函数并且因此 - 文件。因此,无论条件如何,它都会加载所有文件,然后将它们从最终的“编译”中删除。

    虽然话又说回来,如果你在 PHP 文件中包含一个错误的条件,它不会破坏它。而且如果你在一个被包含的文件中声明一个变量,然后用变量的值来决定是否包含它,它就不会取它的值:)

    也许这曾经是旧版本 PHP 中的问题?

    我还没有在加载速度和 RAM 使用方面对其进行测试——但我很想得到一个明确的答案。条件包含是否涉及任何开销?

    【讨论】:

    • 关于包含错误文件的良好观察。如果它正在预加载它们,您将能够通过包含一个爆炸性的错误文件来对其进行测试。
    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 2011-08-11
    • 2015-04-03
    • 2012-02-29
    • 2013-07-15
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多