2011-08-26 29 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來看看它是如何工作的)。 –