簡體   English   中英

在每個頁面上使用不帶use關鍵字的spl_autoload嗎?

[英]Using spl_autoload without use keyword on every page?

我們最近一直在使用OO重寫PHP應用程序的模型代碼。 我們完成了所有的類,並包含了命名空間(以Project \\ Level1 \\ Level2或其他任何形式)。 由於這是一個已構建的應用程序,因此有很多類。 我們正在使用自動加載器,以便於加載類,這很棒。 但這就是麻煩的來源。

我們可能在整個應用程序中散布了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手冊, “導入規則是基於文件的,這意味着所包含的文件將不會繼承父文件的導入規則。”

似乎在我們的應用程序的每一頁上包含這些龐大的use語句正在造成比其價值更大的麻煩。 如果我們在一頁上使用15個類怎么辦? 那么use語句將非常龐大。

我的問題是:麻煩太多了嗎? 我們在使用名稱空間時是否正確,還是在PHP中沒有那么有用? 現在知道了我們要做什么,我們做對了嗎? 我們缺少什么嗎? 我們是否應該一直用完全限定的名稱來調用類?

(這是我關於stackoverflow的第一個問題,所以請讓我知道以后是否需要對我的問題做其他更改或更好的操作)

雖然使用香草Zend Framework Autoloader可能不是您想要的方式,但Zend Loader確實支持自定義自動加載器,這些自動加載器可以遵循以行方式指定或在運行時動態指定的名稱空間。 就您而言,您已經將use Project\\Person\\ as Person ,這已經很麻煩了,您已經注意到了。

將名稱空間與自動加載器一起使用將使您能夠利用通過簡單路徑遍歷來自動分類的優勢來組織類,而不必為獲取有趣的部分而附加大路徑。

因此,您可以保留文件夾結構並使用new Namespace_Person_Address來代替new Corp_Assets_Generic_Person_Address

命名空間避免類名沖突。 特別是在實現自動加載器的大型應用程序中,需要從許多不同的庫中加載正確的類。 使用較短的類名可以使代碼更易於閱讀,但可能難以維護。 添加use語句使它更易於閱讀和以后維護,但是編寫和重構將變得很麻煩。 我建議記錄自動加載器的預期行為,並使用自定義自動加載器使類名更具可讀性。

在php.ini中,將您的文件添加為prepend_file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM