2010-03-11 27 views
6

假設您正在構建一個將在一天內成爲打包產品的Web應用程序,用戶希望能夠擴展和自定義該應用程序。可以選擇自定義類別但統一類名稱

它配備了包括含類PHP文件核心庫:

/library/ 
/library/frontend.class.php 
/library/filesystem.class.php 
/library/backend.class.php 

現在,假設你要保持乾淨核心用戶無法修補。但是,您希望用戶能夠根據需要定製每個螺母和螺栓。

我現在的想法是創建一個自動加載機制,當一個類實例化,首先加載核心包括:

/library/frontend.class.php 

然後,它切換到user目錄,看起來是否有包括相同的名稱:

/user/library/frontend.class.php 

如果存在,它也包括這一點。

顯然,用戶include必須包含一個類定義,它擴展了core include中的定義。

現在我的問題是,我將如何實例化這樣一個類?畢竟,我總是可以肯定有一個定義:

class frontend_core 

,但我不能肯定是有

class frontend_user extends frontend_core 

不過,我想能夠依靠的,實例化,一個類名稱,無論是否存在該類的自定義擴展。

有沒有一個聰明的方法,想法或模式如何實現這一目標?

當然,我可以寫一個簡單的工廠輔助函數,看起來對user類,然後再爲core類,並返回一個初始化的對象,但我真的想保持這個乾淨和簡單越好,因爲正如我所說,它將成爲一種包裝產品。

我正在尋找一種巧妙的技巧或模式,它儘量少用代碼,並儘可能少地引入新的功能。

回答

3

你爲什麼不採取的辦法是使用波輪的核心是什麼?您生成您的基類,並且已經提供了一個空的User類(擴展基類),用戶可以在其中放置覆蓋/特定實現細節,並且在您的代碼中始終引用User類。所以基本上你只是使用你描述的邏輯的逆。

如果上面的解釋不清楚,請查看http://propel.phpdb.org/trac/wiki/Users/Documentation/1.4/QuickStart#a6.UsingtheGeneratedSQLandOMFiles併爲小型數據庫生成代碼。基類位於om文件夾中,(默認爲空)用戶類位於根文件夾中。

+0

如果沒有自定義,我想保留用戶目錄爲空,但另一方面,這是個不錯的主意。它爲用戶提供了簡單的入門點,甚至可以在空的類文件中使用代碼示例和解釋。我會考慮的。 – 2010-03-11 13:20:15

+0

但是,當用戶不使用它時,它也增加了多餘的類以供加載,例如,當用戶選擇使用默認值時,User_Frontend加上Core_Frontend而不是Core_Frontend。 – Gordon 2010-03-14 12:45:11

0

我將實現在覈心掛鉤,因此用戶不必須破解的核心,但仍然能夠延長使用掛鉤

+1

@streetparade。覆蓋或擴展核心類對於更深入的自定義仍然是必需的。我想提供兩種可能性。 – 2010-03-11 13:19:00

0

我認爲當你想使用繼承以及單個文件名時它更復雜。基本上class user_frontend extends core_frontend必須知道在哪裏可以找到這兩個類。兩者都必須包括在內。

如果你只想做new Frontend你可以使用PHP5.3的class_alias指向前端到主要的類使用。低於5.3。您可以使用ServiceFinder,它知道如何將服務名稱映射到類,然後使用$service->get('frontend')或使用Dependency Injection framework獲得前端。

編輯我刪除了之前給出的Loader代碼,因爲它遭受了這個問題。

0

我會使用核心類的構造函數來確定要加載的用戶類,然後在覈心類中實現工廠方法以生成用戶類的實例。通過使用戶類的構造函數受到保護,並讓用戶類擴展核心類,可以確保其他地方的代碼不能實例化用戶類。

C.

0

你可以有一個裝載器類,將決定哪些類的實例:我用一個鉤子系統已經在應用的各個地方

Loader::instance()->load('Frontend') 
相關問題