2013-12-09 39 views
0

通過我的多項研究,我遇到了設置會話和數據庫對象的工廠方法,這些對象在開發過程中一直使用。我想知道的是,拋開個人偏好(儘管我會沉浸在任何人的觀點中),這種通用方法是否有效,是否有效(意思是說,我是否正確使用它)?如果不是的話,你有沒有對如何改進它的建議?將會話和數據庫對象傳遞給PHP中的類

背景

我創造了這樣的代碼,以便當調用類通過數據庫和會話對象的類。我希望能夠傳遞相關對象/引用,以便可以使用它們。

Call類

這個類的調用靜態函數,就像這樣:

class CALL { 
    public static $_db, $_session; 

    public status function class1() { 
     $function = new class1(); 
     $function->set_session(self::$_session); 
     $function->set_database(self::$_db); 
     return $function; 
    } 

    public status function class2() { 
     ... 
    } 
    ... 
} 

的_set類

class _set { 
    public $_db, $_session; 

    public function __construct() { ... } 

    public function set_database($_db) { 
     $this->_db = $_db; 
    } 

    public function set_session($_session) { 
     $this->_session = $_session; 
    } 
} 

現在的類引用。

class class1 extends _set { 
    function __construct() { ... } 

    function function1() { return "foo"; } 
    ... 
} 

所以,在前進,課程將使用CALL::class1CALL::class2調用。之後,他們可以照常進入,又名:

CALL::$_db = $database->_dbObject; 
CALL::$_session = $_SESSION; 
$class1 = CALL::class1; 
echo $class1->function1(); //prints "foo". 
+1

好吧..你可以從擺脫全球狀態開始。這絕對是一個改進。也許[這](http://stackoverflow.com/a/11369679/727208)給你一些想法。 –

+0

哇,令人敬畏的例子,正是我所需要的。我在這個答案上加了一個+1,並且在我的問題中將它標記爲正確。謝謝! – smcjones

回答

0

如果有人絆倒在這,我會與你分享我的解決方案是什麼。

雖然這個練習幫助我學到了很多東西,並且我確信我可以花時間創建一個非常高度功能的工廠/容器,因爲這不是我的程序不可缺少的部分,甚至不是唯一的,所以我最終鞠躬致敬沒有重複已經完成的事情的古老智慧。

我利用了Pimple,這是一個使用PHP閉包創建函數調用的輕量級庫。現在,我可以靈活地確定我想要的依賴注入,但我也只需要注入一次。未來的呼叫,即使他們創建新的實例,也會複製它們。儘管從理論上講,我認爲我的項目是可行的,但確實有一個不幸的問題,就是要求您進入容器進行更改。隨着疙瘩,我不需要那樣做。所以我拋棄了Container類,並從Symfony的製造商那裏找到了一個輕量級程序。雖然這可能不是每個人的最佳答案,但對我而言。乾杯!

1

閱讀關於Dependency Injection。從我的觀點來看,小建議絕不應該在其他對象內創建像$ db或$ session這樣的對象。你應該通過構造函數或setter方法來注入它們。它會使你的代碼更少地依賴於特定的類,並且幾乎不需要重構就可以更容易地替換所有的依賴關係(實際上,如果你知道使用接口很熱就沒有一個依賴關係)。

+1

他已經在使用依賴注入作爲一種方法。在構造函數中傳遞所有依賴關係是**不是強制**。 –

+0

是的,你是對的,這是某種直接投資,但從我的角度來看它是笨拙的。如果看看最後一個代碼塊,有一行'$ class1 = CALL :: class1;'在我看來應該看起來像'$ class1 = CALL :: class1($ db,$ session);'。代碼更具可讀性,更靈活,因爲您不必更改CALL類實現來更改$ db class或$ session類。我看到他在前兩行使用靜態字段,但對我來說這是一個糟糕的設計,正如你上面提到的那樣,這樣的全局狀態也不是正確的方法。 –

+0

+1用於「使用構造函數或setter方法」以及提及接口。將發佈最新動態,但直到今天晚上才能更改。這絕對是指向正確的方向,並最終被列爲「正確的」。 – smcjones