2012-08-30 40 views
1

全局變量通常被認爲是不好的做法,除非絕對必要,所以我正在尋找其他方法來實現某些功能。在PHP中替代全局

我們目前正在開發PHP系統中的CMS系統,並希望允許其他開發人員輕鬆地爲CMS編寫模塊。現在

class CMS 
{ 
    public $version; 
    public $sitename; 
    public $siteurl; 
    public $tbl_prefix; 

    function __construct() 
    { 

    } 

    function RegisterModule() 
    { 

    } 
} 

,我們希望產生的CMS一個實例,並使其開發商(和所有模塊和核心文件)通過變量訪問:$_cms我們如下定義的CMS類。由於我們無法在PHP中使用常量變量,並且使用Singleton模式提供了笨拙的語法來訪問實例(例如CMS::GetInstance()->RegisterModule()),有沒有什麼辦法可以實現我們想要的,而不需要定義一個包含CMS實例的全局變量?

理想的情況下,我們正在尋找類似的語法如下:

_cms->RegisterModule();$_cms->RegisterModule();,前者是優選的。

+0

所以,你基本上想要一個全局變量,但不想把它稱爲全局變量? :-) – lafor

+0

我會說我想要一個*常數*變量,而不是一個全局變量...... ;-) – BenM

+0

+1導致它觸及我的興趣 –

回答

4

需要插件被編碼爲類,其或者extendCMS類或接受它作爲參數傳遞給它們的構造方法。這也被稱爲依賴注入,它只是您可以獲得的最乾淨的界面。

class MyPlugin { 

    public function __construct(CMS $cms) { 
     ... 
    } 

} 

需要插件是班也使得它很乾淨,很容易從你的應用程序包括他們,因爲他們是獨立的,可以很容易地遵循特定的命名和接口規範。

+0

感謝您的意見和答覆。但是如果我想訪問模塊類之外的實例呢?例如在視圖或控制器? – BenM

+1

如果您從模塊類中包含視圖,它將成爲模塊類的一部分,並且可以訪問該實例。 –

+0

感謝您的幫助! – BenM

0

我不知道我在做降神雖然讓我把我的觀點 ,如果我有這樣的問題,我會用魔術方法__call()將適用於文件的其他開發人員將在 工作,它會看起來像 在我的代碼文件

function __call($name,$params) 
{ 
    if($name == 'RegisterModule') 
    { 
     $cms = myRegisty::get('cms'); 
     $cms->RegisterModule($params); 
    } 

} 

之一,而在模塊registation它看起來像

RegisterModule($params); 

希望它能幫助:)我認爲你consern是關於語法和希望更多的熱心期待代碼,所以這是我的觀點