PHP include 最佳实践

3

这里有人知道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时才会被包含?
我比较喜欢用类来实现应用程序中的任何功能,所以我的应用程序通常有很多类文件。

2
你可能想要研究一下自动加载策略。它比使用include_once/require_once更高效,可以简化你的代码。 - Phil
4个回答

5

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

在您的示例中,只有当I_need_to_check_login为真时,include_once才会被执行。


4

只有解释器到达时才会执行包含。例如:

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

在这种情况下,只有b.php会被包含。
更多关于其行为的信息,请参见:PHP手册 - include

很抱歉,根据手册页面的哪个部分可以说明代码将在运行时有条件地被包含?它肯定是有条件执行的,但正如我在评论中所述,可以轻松证明php解析未被执行的文件。 - gview
@gview 不,你显然是错的。看看这个(http://left4churr.com/demos/inc_test.php)和这个(http://left4churr.com/demos/inc_test.php?b),它们是相同的脚本 - 但你可以选择要包含哪个文件。在第一种情况下,一切都正常工作。在第二种情况下,它尝试包含一个有语法错误的文件,并且在包含它时失败 - 完全与你在评论中说的相矛盾。 - NullUserException
是的,我在这个问题上错了——我的测试用例中有一个愚蠢的错误。然而,我没有在手册页面中找到任何关于此的内容,但我明白这不是你包含链接的原因。 - gview
@gview 我相信它某处在手册中,但我现在找不到它。 - NullUserException

4

是的,每次你需要调用:$C = new Class(); 时,都需要require或include文件。现在你可以使用以下方法代替include_once:

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

这意味着如果你之前已经包含了它,你可能不需要再次包含它。这样做还可以提高性能,因为include的执行速度比include_once快。

使用 include_once 结合 class_exists 检查有什么问题吗? - zerkms
1
class_exists会检查类是否已经加载(例如,您已经在其他文件中包含了它)-现在include_once必须检查您的代码是否已经包含该文件。阅读https://dev59.com/FG855IYBdhLWcg3weEKJ获取更多信息。(我建议运行STRACE以查看它是如何工作的)。 - Book Of Zeus

2

只有在执行 include_once 命令时,文件才会被包含。

因此,如果 I_need_to_check_login 评估为 false,则根本不会包含文件。

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


1
include_once 简单地检查目标文件是否已经被包含。否则,它将再次加载源文件,根据内容的不同,这可能会成为一个问题。 - gview
1
@gview:没错,但你想对我说什么?我回答的问题是:“如果我这样做,文件Class.class.php是否会在每次运行代码时被包含,还是只有在执行include_once时才会被包含。”简短的答案是“只有在执行include_once时才会运行”。不明白它与你的通知有什么关系。 - zerkms
我想说的是,根据我阅读你的回复的方式,我认为你的答案是不正确的。有很多东西可以被包含但不会被执行。如果我有一个包含文件声明了一堆未使用的函数,它们会被包含,但不会被执行。 - gview
@gview:你在作弊——包含的文件已经被解析了。你对“executed”这个术语的使用方式很令人困惑。请再次阅读原始问题:“如果我这样做,Class.class.php文件会在每次运行代码时都被包含,还是只有在执行include_once时才会被包含?” - zerkms
@zerk 对于 PHP 中的 include 如何工作感到困惑。请查看他/她在这个问题及其答案的评论和回答。 - NullUserException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接