2016-09-21 97 views
0

我一直在想这一段时间,我还没有看到在SE的答案。避免重复的PHP包括/需要

当在php中使用includes时,我的工作理解是任何代码包括都将由服务器处理。

这意味着在以下条件下,即使这些包括的其中一个包含EMPLOYED,也会在服务器上处理大块代码块。

<?php 
if($conditional === TRUE){ 
    include("MASSIVEAMOUNTOFCODE.php"); 
} 
else { 
    include("GARGANTUANAMOUNTOFCODE.php"); 
} 
?> 

(请原谅这里的粗略简明的代码。)

我最近使用下面的结构来执行相同的任务,以节省处理时间在服务器上的目标开始。 请告诉我,如果这仅加载一个包含文件,或者,如果我是一个傻瓜的差事:

<?php 
if($conditional === TRUE){ 
    $includeFile = "MASSIVEAMOUNTOFCODE.php"; 
} 
else { 
    $includeFile = "GARGANTUANAMOUNTOFCODE.php"; 
} 

include("$includeFile"); 
?> 

注意的双重用途“包括”第一样品中,只有一个使用“包括“在第二个样本中。

+0

我认为你的原始前提是错误的。它只处理'include'行之一。 – Barmar

+0

预编译器和字节码缓存通常包含代码。所以使用更简单的“包含结构”应该是更好的选择。包含部分的执行时间显然只有在实际执行时才是问题。所以,就像直觉一样,我会坚持第一种方式 - 但更重要的是,我会尝试以这样的方式构建我的代码,使得我不必有条件地将其包含在第一位。 –

回答

2

你原来假设两个文件都被处理是错误的。在从未执行过的代码块中的include语句将被忽略。

您可以看到,通过在未执行的分支中的包含文件中添加语法错误,这是真实的。我所做的:

testinclude.php:

<?php 
if (false) 
    include 'badinclude.php'; 

echo "done\n"; 

badlinclude.php:

<?php 

$foo =; 

当我执行testinclude.php没有关于badlinclude.php语法错误投诉。但如果我将if (false)更改为if (true),则会出现错误。

Parse error: syntax error, unexpected ';' in /Users/barmar/badinclude.php on line 3

所以你的代码的两个版本应该是等价的。

+0

我喜欢这种方法,但是 - 尊重 - 我希望看到说明未执行的分支没有编译的文档。 – Parapluie

+0

它如何编译一些语法错误的东西呢? – Barmar

+0

我回到了没有语法错误的假设。 – Parapluie

-1

你的假设是错误的。

include所做的是,当函数为时,调用它将在与调用它的位置相同的环境中将该文件作为新的PHP文件加载。

例子:

test.php的:

<?php $test = 'test'; include('test2.php'); ?> 

test2.php:

<?php echo $test; ?> 

这将输出:

test 

回到你问的问题,它不会处理这两个文件,因为当一个被调用时,如果某事是真实的,它不能同时执行两个函数调用,而另一个则不然。包括像任何其他正常函数一样工作,因为它在调用之前不会被执行。

如果您想确保文件只包含一次,或者甚至要求一次加载文件,请使用include_oncerequire_once