2011-09-08 90 views
1

包含不使用的類對性能有影響嗎?

require "class.a.php"; 
require "class.b.php"; 
require "class.c.php"; 

class main{ 
function main(){ 
    if(condition_is_met(){ 
     $this->something = new A(); 
    }else{ 
     $this->something = new B(); 
    } 
} 

} 

如果該文件包含在與require_once健康檢查,而不是所有的時間?

回答

0

應該影響只表現是分析它的時間,但我認爲這是優於複雜,包括隱藏的邏輯中途你的文件裏。更不用說,如果你把if語句放在if語句中,就好像你在那個if語句中插入了那個文件的文本,這是不正確的(也許不行)。

誰能告訴我,如果你能/ if語句聲明一個類裏面的函數?

1

PHP必須打開該文件,並解析它,所以它有一定的影響。對於一些文件,我不會擔心它,但隨着文件的增加它可能會失去控制。這就是爲什麼有自動加載,它允許您在需要時只加載的類文件,而無需一個長長的清單在你的文件的頂部,需要:

http://php.net/manual/en/language.oop5.autoload.php

spl_autoload_register也看一看:

http://www.php.net/manual/en/function.spl-autoload-register.php

+0

PHP是否保留源文件的預編譯的版本緩存或者文件解析,並與每個請求編譯? – Tomalak

+0

並使用[PSR-0文件命名約定](https://groups.google.com/group/php-standards/web/psr-0-final-proposal?pli=1)最大限度地減少自動裝載機的數量(如果所有庫都使用PSR-0,則只有一個自動加載器) – arnaud576875

+0

@Tomalak,這是操作碼緩存的主要目的(請參閱[APC](http://pecl.php.net/packages/APC))。沒有它們,PHP會在每個請求中再次編譯相同的文件。 – arnaud576875

1

問題不明確。在當前的代碼中,我認爲所有的文件都將被包含,無論你使用(聲明這些類的變量)還是不使用它們。如果您不想加載不使用的課程,則可以使用__autoload()函數。您使用

http://php.net/manual/en/language.oop5.autoload.php

+1

並使用[PSR-0文件命名約定](https://groups.google.com/group/php-standards/web/psr-0-final-proposal?pli=1)最大限度地減少自動裝載機的數量(如果您所有的庫使用PSR-0,你只能有一個自動加載磁帶機) – arnaud576875

+0

感謝@ arnaud576875您的建議:) – giga

0

任何時候包括或要求,PHP基本上是複製/從required文件中的代碼粘貼到你的代碼。因此,無論你放在哪裏,PHP仍然打開文件,讀取它並將其放在那裏,它不會受到if塊的影響。換句話說,在代碼實際運行之前,需要被解析,所以是的,即使require被放入if塊並且永遠不會運行,你也會獲得(非常小的)性能。請記住,這是一個非常小的影響。最後,如果你擔心了,我會用require_once - 這樣可以保證如果第二required文件requires第一個文件,這種冗餘不會達到第二性能命中此分析不發生兩次,例如。

+0

我不認爲它被解析,如果你的條件塊使用它。如果我在文件中添加一些隨機字符,那麼如果需求在最前面,每次都會得到解析錯誤,但是如果我將它們放在if塊中,那麼只有在條件滿足的情況下才會出現錯誤 – Morpha

+0

影響不大?通過訪問文件系統(光盤讀取)不會弄髒手較長的時間? – giga

+0

嗯,磁盤讀取會增加一點開銷,但我的答案假定這些文件位於本地文件系統(未安裝在網絡上)以及具有至少1.5gbps SATA驅動器的現代系統上。顯然,在配備舊ATA硬盤的系統上運行該操作將會帶來顯着的性能提升。 Morpha - 正確的,它不會被解析,但它仍然被讀取和放入。 – Chris