2011-01-31 109 views
0

我一直在使用我自己的make PHP 5.3 web應用程序框架,我必須說這是一個相當愉快的工作。我實際上認爲這是開放源代碼,並允許其他人感受到我所做的同樣的喜悅;)如何在框架中擴展核心類

這是我的問題。它有多重要,所有的核心課程都必須是可擴展的,什麼是好的方法來實現這一點? Codeigniter使用單例模式EVERYWHERE,這是不可能的。 Kohanas文件系統很甜蜜,但爲了我的口味,它包含了許多文件(空類)的方式。

我從來沒有使用Symfony,但我聽說它利用了依賴注入?我不是那個話題的大師,但有一些知識。這是要走的路嗎?有沒有更聰明的方法?

P.S.我使用PHP 5.3的命名空間,封閉等

/托比亞斯(開發瑞典人)

回答

0

我真的很喜歡Zend框架這樣做的方法:有大多是一個抽象類(將其擴展)和具體類(具體用例),例如數據庫映射器:

你可以擴展Zend_Db_Table_Abstract類:

class Bugs extends Zend_Db_Table_Abstract 
{ 
    protected $_name = 'bugs'; 
} 

或者,如果你只需要簡單的功能,你可以創建一個新的數據庫表對象是這樣的:

$bugTable = new Zend_Db_Table('bug'); 
// Zend_Db_Table extends Zend_Db_Table_Abstract 

所以你必須爲您的解決方案中的每種類型創建兩個類:抽象類和具體類。

更多信息: http://framework.zend.com/manual/en/zend.db.table.html

2

我會看看Symfony2LithiumZend Framework,我認爲他們是最好的與問候來設計的。我會建議不要使用單例,而是使用依賴注入。

它對於所有核心類必須是可擴展的以及什麼是一個很好的方法來實現它有多重要?

這真的取決於類的責任。有可能你不希望MVC堆棧中的某些核心組件(假設它是MVC)被擴展,你可以聲明它們爲final,或者將某些方法聲明爲final,並通過插件和幫助程序強制擴展。其他類可能被設計爲擴展,在這種情況下,它們應該被聲明爲抽象類。

IMO,您應該主要使用受保護的屬性並提供訪問器方法。但是,不要只在所有的房產中使用受保護的可見性,有些公共和私人都可以,但這一切都歸結爲責任。

所有考慮一類多少責任了,如果它服務於多個角色/目的,它的時間來重構和拆分班級分成太多或多個類別。不要忘記使用接口!

實際上,我認爲去開源與它允許其他人有同樣的感覺喜悅我做;)

在你走之前釋放你的代碼考慮以下幾點:

  • 我所有的代碼單元都經過測試嗎?
  • 我是否使用版本控制?
  • 我有完整的API文檔嗎?

我討厭成爲一個沮喪者,但是如果你對這些問題中的任何一個回答「不」,不要擔心開放源代碼是否適當,因爲沒有人會使用它。也許剛開始使用SCM的GitHub。還要考慮到那裏已經有很多頂級框架了,爲什麼他們會用你的呢?

也請務必閱讀Top ten reasons why I wont use your open source project

......我只是想讓您免於將額外的不必要的努力投入到您的項目中供公衆使用,而無論如何您都無法獲得任何牽引力。

+0

我明白你的意思,但是這讓人非常沮喪。希望我們仍然有一些「重新引導者」留下來,所以新的開源項目出現了:/我看了Symfony2,Li3並認爲依賴注入是一條路。我已經開始整合它,它看起來很不錯。 :)謝謝你的回答。/Tobias – sandelius 2011-02-03 16:09:07