【问题标题】:PHP include practicesPHP包含实践
【发布时间】:2011-11-04 04:05:17
【问题描述】:

这里有人知道 PHP 何时执行 include 和 include_once 调用吗?

我想知道,因为我来自 Flash 和桌面开发背景,你必须在每节课开始时导入你的类。

但是现在我开始构建更复杂的 PHP 代码,似乎在我真正需要类以节省加载时间时只包含它们会更好。例如,看下面的伪代码:

if (I_need_to_check_login)
 { 
   include_once "Class.class.php";
   $C = new Class();
 }

如果我这样做,文件 Class.class.php 是否会在每次运行代码时或仅在我执行 include_once 时才包含在内。

我有点类怪胎,通常为我的应用程序使用的任何功能构建一个类,所以我经常有很多类文件。

【问题讨论】:

  • 您可能想查看autoloader strategy。它比使用include_once/require_once 更高效,并简化您的代码

标签: php


【解决方案1】:

include、include_once 是标准的 PHP 指令。这意味着当解释器在程序流中找到一个时,他会执行每个包含、include_once。如果控制结构避免执行具有包含指令的一段代码,则不会执行该代码。

在您的示例中,当且仅当 I_need_to_check_login 为 true 时,才会执行 include_once。

【讨论】:

    【解决方案2】:

    仅当解释器到达那里时才执行包含。例如:

    $variable = false;
    if ($variable) {
        include 'a.php';
    } else {
        include 'b.php';
    }
    

    在这种情况下,只会包含 b.php。

    有关其行为的更多信息:PHP Manual - include

    【讨论】:

    • 抱歉,根据手册页的哪一部分声明代码将在运行时有条件地包含在内?它当然是有条件地执行的,但正如我在下面的评论中所说,很容易证明 php 解析了未执行的文件。
    • @gview 不,你显然错了。见thisthis;这是相同的脚本 - 但您可以选择要包含的文件。在第一种情况下,一切正常。在第二种情况下,它尝试包含一个包含语法错误的文件,并在 包含它时失败 - 完全与您在评论中所说的相矛盾。
    • 是的,我错了——我的测试用例有一个愚蠢的错误。手册页不包含我能找到的任何相关内容,但我知道这不是您包含指向它的链接的原因。
    • @gview 我相信它在手册中的某处,但我现在找不到。
    【解决方案3】:

    是的,每次您必须致电:$C = new Class(); 您都必须要求或包含该文件。现在你可以代替 include_once 做的是:

    if (!class_exists('MyClass')) {
        include("Class.class.php");
    }
    

    这意味着如果您之前已经包含它,您可能不会再次包含它。这也将提高性能,因为 include 的执行速度比 include_once 快。

    【讨论】:

    • 使用include_onceclass_exists 检查有什么问题?
    • class_exists 将检查该类是否已加载(例如,您已将其包含在其他文件中) - 现在 include_once 将必须检查您的代码是否已包含该文件。阅读stackoverflow.com/questions/4326435/… 了解更多信息。 (我建议运行 STRACE 看看它是如何工作的)。
    【解决方案4】:

    只有在您执行include_once 命令时才真正包含文件

    因此,如果 I_need_to_check_login 的计算结果为 false - 根本不会包含文件

    通过在该文件的第一行添加echo "I've been included"; exit;,您可以轻松地自行检查。

    【讨论】:

    • include_once 只是检查目标文件是否已被包含。否则它只会再次加载源代码,并且根据内容,这可能是个问题。
    • @gview:正确,但你想对我说什么?我回答的问题是“如果我这样做,文件 Class.class.php 是否会在每次运行代码时包含在内,或者仅在我执行 include_once 时包含。”简短的回答是“它仅在执行 include_once 时运行”。无法了解它与您的通知有何关系。
    • 我的意思是我阅读您的回复的方式,我相信您的回答是不正确的。有很多东西可以包括但不能执行。如果我有一个包含文件,其中声明了一堆未使用的函数,它们会被包含,但不会被执行。
    • @gview:你在作弊 - 包含的文件无论如何都已被解析。您正在以令人困惑的方式使用 executed 术语。再次,请阅读原始问题:“如果我这样做,文件 Class.class.php 会在每次运行代码时包含还是仅在我执行 include_once 时包含。”
    • @zerk 他/她对include 在 PHP 中的工作方式感到困惑。查看他/她对这个问题及其答案的回答和答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2013-03-03
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多