2009-09-10 21 views
6

From php.net在PHP中使用自動加載不好嗎?

在PHP 5中,這不再需要。您可以定義一個__autoload()函數,在您嘗試使用尚未定義的類/接口的情況下會自動調用該函數。通過調用這個函數,腳本引擎有最後一次機會在PHP失敗並且出現錯誤之前加載類。

現在我想知道,單獨使用__autoload在動態網站上加載適當的類是不好的做法嗎?

的方式我的網站設置是包含文件到index.php文件,例如http://www.site.com/index.php?p=PAGE-I-WANT-TO-LOAD

所以,如果我在論壇上的部分或我的網站的博客部分,我想只有適當的類和函數被加載,所以我使用自動加載,但我從來沒有手動包含一個文件,我應該使用__autoload作爲最後的手段,或者即使在高流量系統我做得很好嗎?

回答

8

不好?編號爲__autoload()是我最喜歡的補充PHP 5之一。它消除了手動必須包含/需要您的應用程序所需的類文件的責任(和煩惱)。這就是說,作爲開發者,確保只有「合適的類」被加載完全取決於你。這很容易通過結構化的命名方案和目錄結構來完成。網上有很多關於如何正確使用__autoload()的例子,做一個谷歌搜索,你會發現很多信息。

+1

是的,我已經在使用它了,我在問它是否依賴於它的性能打擊 – JasonDavis 2009-09-10 22:37:07

+2

@jason:您應該在您的問題中明確說明這一點,因爲您現在沒有提及任何有關性能的內容。 – 2009-09-10 22:42:50

+0

@musicfreak你是對的,但如果它不是很好的表現,那麼它很可能被認爲是「壞習慣」 – JasonDavis 2009-09-10 22:48:28

8

自動加載只是加載需要的類的好方法。

在PHP 5> = 5.1.2中,舊的__autoload()的大部分問題消失了,這歸功於spl_autoload_register()

+1

我只是看着引用的spl_autoload_register()頁面,但我並不真正瞭解它,它是需要還是正在使用基本的__autoload函數可以嗎? – JasonDavis 2009-09-10 22:36:35

+1

如果你想有多個自動加載器,你必須使用spl_autoload_register,如果沒有,__autoload將會很好。 – 2009-09-10 22:53:54

+0

spl_autoload_register()的主要賣點是類庫可以定義它自己的自動加載函數,而不會因爲__autoload()定義兩次而導致運行時錯誤。 – gnud 2009-09-11 07:42:00

3

__autoload()的唯一危險是如果你定義了一個糟糕的自動加載函數。一般來說,只要找到包含您的類的正確文件,就可以在磁盤尋找方面獲得性能優勢。好處是擺脫所有那些煩人的include()電話。

如果您擔心此級別的性能,那麼您應該已經在使用操作碼緩存,例如APC。

+0

是的,我使用APC,我真的不擔心我只是不希望繼續使用自動加載器,如果它不好意思加載文件或將它用作備份,就像您忘記了文件一樣,謝謝對於信息 – JasonDavis 2009-09-10 22:52:16

4

現在我想知道,單獨使用__autoload在動態網站上加載適當的類是不好的做法嗎?

根本不是。你可以依靠自動加載,你所需要做的就是制定一個好的命名約定並實現一個高效的自動加載器。

有一個主要問題需要考慮。自動加載和Zend Guard在一起玩的不好,因爲Zend Guard往往會重命名一些東西,這意味着您決定使用的命名約定很可能不會相同。如果您將使用Zend Guard(或者其他任何混淆器),您很可能會被迫手動添加所有文件。

這裏是從Zend衛隊用戶指南報價:

自動加載的類將無法工作,因爲磁盤上的文件名不會 匹配混淆的類名。

+0

我目前已經使用自動加載,但這是一個很好的關於它不與Zend Guard合作,我不使用但仍然很好地瞭解+1 – JasonDavis 2009-09-10 22:50:25