2016-09-21 109 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