2010-07-26 61 views
8

我有一個腳本,使用autoload加載未找到的類。我不特意包含文件(雖然我可以)但我希望自動加載功能包含所需的文件。PHP __自動加載性能

因爲腳本可以遞歸,也就是說如果這個類已經被加載了,我不想檢查相應的文件是否被加載,如果是class_exists就是每次遞歸的腳本。

回答

9

如果要避開__autoload,可以使用require_once而不是include

使用__autoload的性能可能會很高,尤其是因爲某些操作碼緩存不能正確支持它。但是,鑑於它非常方便,我會說使用它,除非您的操作碼緩存不緩存自動加載包含。

+1

不要忘記還有'include_once()'。 – alex 2010-07-26 00:54:16

+4

@alex除非絕對必要(我們很少這樣做),我寧願從'include'引導人們。作爲一個在文件不存在的時候或多或少都會失敗的構造,它幾個小時就被偷走了。 – Artefacto 2010-07-26 00:57:20

+0

@Artefacto同意,只是想我會提到它。此外,操作碼緩存的東西是有用的,所以+1 – alex 2010-07-26 01:01:02

6

如果您的自動加載器設置爲加載您的類並且未使用require(等),則只有在引用了不存在的類時纔會調用自動加載器。所以在自動加載器中從不需要檢查class_exists(如果類存在,它將不會被調用)。

關於性能。如果您使用大型庫,自動加載實際上可以更快,因爲它只加載所需的文件/類。無論哪種方式,速度命中是我的經驗可以忽略不計(總是使用操作碼緩存,如其他人所述)。

+0

我沒有談論在autoload中使用class_exist ..我的意思是如果我不使用autoload函數,我必須在嘗試訪問類之前使用class_exist,我的意思是我不會手動執行自動加載的東西,即如果class doesn不存在包含一些文件,而不是再次嘗試,因爲腳本將遞歸,我將檢查相同的事情,即使是已經加載的類。 – CoCoMo 2010-07-27 11:36:37