2009-03-05 74 views
4

建議您將什麼解決方案包含在PHP項目中?爲PHP導入包或自動加載?

  1. 有沒有手動調用的需要/包括的功能 - 一切加載自動加載通過功能
  2. 包裝進口,在需要的時候。

這裏是包導入API:

import('util.html.HTMLParser'); 
import('template.arras.*'); 

在這個函數的聲明,你可以爆炸以點串(包層次分隔符),通過特定的包(文件夾)的文件循環,只包含一個如果星號符號在字符串的末尾被找到,例如,它們或它們全部( 'template.arras。*')。

我可以在包導入方法中看到的好處之一是,它可以強制您使用更好的對象分解和類分組。

我可以在自動加載方法中看到的一個缺點是自動加載功能可能變得非常大而且不是非常明顯/可讀。

您對此有何看法?

  • 您可以在每種方法中列出哪些優點/缺點?
  • 如何找到該項目的最佳解決方案?
  • 如何使用包管理來了解是否會出現性能問題?
+0

有關此主題的另一個問題:http://stackoverflow.com/questions/791899/efficient-php-auto-loading-and-naming-strategies – grossvogel 2010-05-31 18:20:47

回答

4

我廣泛使用__autoload()。我們在我們的應用程序中使用autload功能具有更高班級的向後兼容性了一些調整,但我們在創建新類,允許自動加載時,一般遵循的約定()以相當無縫工作:

  • 一致類命名:每個類都在它自己的文件中,每個類都用camel-case命名並用下劃線分隔。這映射到類路徑。例如,Some_CoolClass映射到我們的類目錄,然後是'Some/CoolClass.class.php'。我認爲一些框架使用這個約定。
  • 明確要求外部類:由於我們無法控制我們使用的任何外部庫的命名,我們使用PHP的require_once()函數加載它們。
0

我強烈建議執行以下操作來代替:

擲所有的類都爲靜態數組的className =>文件路徑/類文件。自動加載函數可以使用它來加載類。

這確保您始終加載最少量的文件。這也意味着你可以避免完全愚蠢的類名和解析這些名字。

如果速度很慢,您可以使用某些加速器,如果速度仍然很慢,您可以獲得更多,您可以通過「編譯」流程運行,其中經常使用的文件只是被轉儲通用文件和自動載入引用可以更新爲指向正確的位置。

如果您開始遇到自動加載速度太慢的問題(我覺得很難相信),那麼可以根據軟件包將其拆分,並且具有多個自動加載功能,這樣只需要數組的子集,這樣如果您的軟件包是圍繞您的軟件模塊(登錄,管理員,電子郵件等)定義的,則效果最佳(

1

導入方法是一種改進,但仍會加載超過需要的內容。
或者通過使用星號或腳本的開始裝起來(因爲在導入之前所有的「新類別名稱」會成爲累贅)

我還是__autoload()風扇的甚至更好spl_autoload_register()
因爲它將只包括您正在使用的課程以及不關心課程所在位置的額外好處。如果你的大學把文件移動到另一個目錄,你不受影響。

缺點是它需要額外的邏輯 才能使其與目錄正常工作。

0

我不是__autoload()的粉絲。在許多庫(例如一些PEAR庫)中,開發人員使用class_exists()而不傳入相對較新的第二個參數。您擁有的遺留代碼也可能存在此問題。如果您定義了__autoload(),這可能會導致警告和錯誤。

如果你的圖書館很明確,但你沒有遺留代碼來處理,它是一個很棒的工具。我有時希望PHP對他們如何管理class_exists()的行爲有點聰明,因爲我認爲問題出在那個功能上,而不是__autoload()

1

我使用require_once(「../路徑到自動負載script.php.inc」),支持自動負載

我對所有類和INC文件,這使得它更容易標準命名約定以編程方式確定當前正在請求什麼類名稱。

例如,所有的類都具有一定的延伸一樣inc.php
(所以我知道他們會在/ CLS目錄)

所有Inc文件開始.HT(這樣就在/ inc目錄中)

自動加載接受一個參數:className,然後用它來確定文件實際位於何處。循環一次,我知道我的目標目錄是什麼,每次添加「../」來說明子子頁面(這似乎爲我打破自動加載),並最終require_once'ing實際的代碼文件一旦找到。

0

滾動您自己的包裝系統可能是一個壞主意。我建議你去明確的手動包括,或與自動加載(或爲此事的組合)。