2012-06-04 42 views
2

我們最近使用OO重寫了我們的PHP應用程序的模型代碼。我們已經完成了類,並且我們包含了名稱空間(以Project \ Level1 \ Level2的形式或其他形式)。由於這是一個已經建好的應用程序,因此有很多類。我們使用自動加載器,以方便加載類,這非常棒。但是這裏是麻煩來的地方。在每個頁面上使用spl_autoload而不使用關鍵字?

我們可能有300頁散佈在整個應用程序中,並且它們都需要一個PHP文件(一種引導腳本)。自引導程序腳本在該引導程序文件中是必需的。

現在,我們大部分的頁面將使用至少一個,但可能會有很多類。我們知道,我們這裏有兩種選擇:

//either call the classes using qualified names 
$person = new Project\Person; 

//or include the "use" keyword on every page, so we can alias the classes for ease of use 
use Project\Person as Person; 
$person = new Person; 

但麻煩的是,我們實在不好意思要做到這一點在我們的應用程序的每一個頁面上:

require_once('../php/bootstrap.php'); 
use Project\Person\ as Person, 
    Project\Address\ as Address, 
    Project\Group\ as Group 
    Project\CustomField\ as CustomField; 
$person = new Person; 
$address = new Address; 

我們盡力了,對於包括引導程序文件中所有類的use關鍵字,但根據PHP手冊,「導入規則是基於每個文件的基礎,這意味着包含的文件不會繼承父文件的導入規則。」

在我們的應用程序的每個頁面中包含這些龐大的使用語句似乎是創造了更多的麻煩而不是它的價值。如果我們在一個頁面上使用15個課程呢?那麼使用聲明將是巨大的。

我的問題是這樣的:它太麻煩了嗎?我們在使用名稱空間方面是否正確,還是它在PHP中不是很有用?現在知道我們正在努力做什麼,我們做對了嗎?有什麼我們失蹤?我們是否應該始終用完全合格的名稱來調用類?

(這是我的計算器上的第一個問題,所以請讓我知道,如果我需要與我未來的問題不同的或更好的做任何事情)

+0

也許你可以看看Zend Framework命名空間類的方式嗎? http://framework.zend.com/manual/en/zend.loader.autoloader.html –

+0

+1好問題:) –

+0

@NickCaballero,感謝您的建議。我們在重寫時看到了Zend,但決定不遵循他們的確切方法。用他們的下劃線解決方案,它實質上使每個班級名稱成爲完全合格的名稱,這非常繁瑣。但我想他們可能會這樣做,以通過這個愚蠢的問題與PHP。 :) –

回答

1

雖然使用vanilla Zend Framework Autoloader可能不是您想要的方式,但Zend Loader不支持自定義自動加載器,它可以尊重內聯或動態運行時指定的命名空間。在你的情況下,你正在使用use Project\Person\ as Person,這可能會變得很麻煩,正如你已經注意到的那樣。

在自動加載器中使用名稱空間將允許您利用自動加載,使用簡單路徑遍歷來組織類,而不必附加大路徑來訪問有趣的部分。

因此,而不是new Corp_Assets_Generic_Person_Address,您可以保留文件夾結構並使用new Namespace_Person_Address

名稱空間避免類名稱中的衝突。特別是在實現自動加載器的大型應用程序中,這些應用程序需要從許多不同的庫中加載類右側的。使用較短的類名會使代碼更易於閱讀,但可能會使其難以維護。添加use語句使得讀取和稍後維護更容易,但是編寫和重構會很麻煩。記錄自動加載器的預期行爲並使用自定義自動加載器來創建更具可讀性的類名是我的建議。

0

在php.ini中添加文件作爲prepend_file

+0

首先,我似乎無法讓auto_prepend_file命令在我的.htaccess文件中工作。不斷給我一個「內部服務器錯誤」。也許我在那裏做錯了什麼。其次,您能否解釋您的解決方案將如何幫助我們取悅?因爲根據我讀到的有關auto_prepend_file的內容,它只是在每個PHP請求的開始處包含()一個文件,這仍然不能幫助我們的問題(因爲「導入規則是每個文件的基礎」)。如果您有任何進一步的澄清,請讓我知道! –

相關問題