2011-08-26 45 views
3

有没有人知道PHP何时执行include和include_once调用?PHP包含实践

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

但是现在我开始构建更复杂的PHP代码,看起来好像仅仅包含类,当我真的需要它们来节省加载时间时。例如,看看下面的伪代码:

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

如果我这样做,是文件Class.class.php将被列入每次运行代码或者只有当我执行include_once。

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

+2

您可能想查看[自动加载器策略](http://php.net/manual/en/language.oop5.autoload.php)。它比使用'include_once'''' require_once'更高效,并简化了您的代码 – Phil

回答

4

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

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

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

更多关于它的行为:PHP Manual - include

+0

对不起,基于手册页的哪一部分,它声明代码将在运行时有条件地包含在内?它肯定会有条件地执行,但正如我在我的评论中所述,可以很容易地证明php分析未执行的文件。 – gview

+0

@gview不,你显然是错的。见[this](http://left4churr.com/demos/inc_test.php)和[this](http://left4churr.com/demos/inc_test.php?b);它是相同的脚本 - 但你可以选择包含哪个文件。在第一种情况下,一切正常。在第二种情况下,它会尝试包含一个文件,其中包含语法错误,并且在包含**之后会失败** - 完全与您在评论中说的内容相矛盾。 – NullUserException

+0

是的,我错了 - 我的测试案例中有一个愚蠢的错误。然而,手册页并没有包含任何有关我可以找到的信息,但我知道这不是你为什么包含链接的原因。 – gview

2

文件实际上都包含只有如果执行include_once命令。

因此,如果这I_need_to_check_login计算结果为false - 文件将不被包括在所有

可以通过自己与添加echo "I've been included"; exit;该文件的第一行很容易检查。

+1

include_once只是检查目标文件是否已包含在内。否则,它会再次加载源代码,根据内容,这可能是一个问题。 – gview

+1

@gview:正确,但你试图对我说什么?我回答的问题是“如果我这样做,是每次运行代码或只有在执行include_once时才会包含Class.class.php文件。”简短的回答是“只有在执行include_once时才运行”。无法了解它与您的通知有何关系。 – zerkms

+0

我在说的是我阅读你的回复的方式,我相信你的回答是不正确的。有很多东西可以被包含但没有被执行。如果我有一个包含文件来声明一堆未使用的函数,它们将被包含,但不会被执行。 – gview

5

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

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

4

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

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

这意味着你可能没有你再有它,如果你之前已经包含它。这也将提高性能,因为include比include_once更快执行。

+0

使用'include_once'和'class_exists'检查有什么不对吗? – zerkms

+1

class_exists将检查类是否已经加载(例如,您已经将其包含在其他文件中) - 现在,include_once必须检查您的代码是否已包含该文件。阅读http://stackoverflow.com/questions/4326435/php-include-vs-include-once-speed了解更多信息。 (我建议运行一个STRACE来看看它是如何工作的)。 –