2011-11-01 104 views
3

我想獲取現有對象的實例。我如何做到這一點,而不必將對象作爲參數傳遞?這是我現在在做什麼:PHP OOP - 將對象的實例獲取到另一個類

class clas1 { 
    public $myArray; 

    public function setArray($a){ 
     $this->myArray = $a; 
    } 
} 

class clas2 { 
    public $test; 

    function __construct($obj) { 
     $this->test = $obj; 
    } 
} 

$c = new clas1; 
$c->setArray(array('firstname'=>'Fred')); 

$c2 = new clas2($c); 

var_dump($c2); 

的var_dump的輸出是:

object(clas2)[2] 
    public 'test' => 
    object(clas1)[1] 
     public 'myArray' => 
     array 
      'firstname' => string 'Fred' (length=4) 

我想我可以有每個對象的父對象的屬性,但是否有任何其他建議?

+3

什麼是錯的這種方式?根據您需要對clas1實例執行的實際操作,您可能需要也可能不需要在clas2屬性中存儲實例的鏈接。 –

+3

你現在這樣做的方式被稱爲依賴注入(http://en.wikipedia.org/wiki/Dependency_injection),實際上往往是首選的方法。 –

+0

我希望能夠使用這些方法並訪問屬性的當前值。有沒有辦法通過做像$ test =&new $ clas1這樣的東西來獲得現有的實例?像獲得參考?請原諒我的無知......我只是把我的頭轉向OOP。看起來「笨重」必須通過對象。 – Owen

回答

2

通過調用靜態方法(如在單身)拉的對象是一個不好的做法(甚至是反模式)。對於新手來說,單身和靜態類感覺很自然,因爲它們的工作方式與我們在過程範式中學習的方式相同,但是您應該避免它們(只有在沒有狀態時才使用靜態類)

您應該完全傳遞該對象作爲參數,以避免引入隱式依賴,並做好OOP。

閱讀關於依賴注入

如果對象的創建變得複雜和煩惱,你可以隨時使用Dependency Injection Container

0

你應該使用sigleton模式:

class class1 
{ 
    private static $_instance; 
    public static function getInstance() 
    { 
     if (is_null(self::$_instance)) { 
      self::$_instance = new self; 
     } 
     return self::$_instance; 
    } 
    private function __construct() {} 
    private function __clone() {} 
} 

class class2 { 
    public function __construct() 
    { 
     $obj = class1::getInstance(); 
    } 
} 

$a = class1::getInstance(); 
$b = new class2(); 
+1

歐文沒有說任何關於需要只有一個clas1的例子 –

+0

這個解決方案匹配我想要實現的。 – Owen

+0

空__construct()和__close()函數的原因是什麼? – Owen

相關問題