2011-05-12 65 views
2

是否可以將類的屬性設置爲對象?作爲對象的PHP屬性

像:

class User { 

    public $x = ""; 
    public $y = new ErrorVO(); 
    public $w = new array(); 

} 

回答

6

在構造函數中,是的。

class User 
{ 
    public $x = ""; 
    public $y = null; 
    public $w = array(); 

    public function __construct() 
    { 
     $this->y = new ErrorVO(); 
    } 
} 

編輯

KingCrunch取得了良好的一點:你不應該硬編碼的依賴性。您應該將它們注入到對象中(控制反轉(IoC))。

class User 
{ 
    public $x = ""; 
    public $y = null; 
    public $w = array(); 

    public function __construct(ErrorVO $y) 
    { 
     $this->y = $y; 
    } 
} 

new User(new ErrorVD()); 
2

你不能在屬性聲明宣佈他們,但你可以在構造__construct()array()可以在public $w被實例化,而不new關鍵字實例化它們:public $w = array();

public function __construct() 
{ 
    $this->y = new ErrorVO(); 
} 
+0

謝謝,它會幫助很多=) – Gerep 2011-05-13 18:29:35

2

是的,這是。實例化過程中

  • class B { 
        public $b; 
    } 
    
    $my_object = new B(); 
    $my_object->b = (object)array(
        'property' => 'test', 
    ); 
    echo $my_object->b->property; // should also show 'test' 
    

class A { 
    public $a; 
    public function __construct() { 
     $this->$a = (object)array(
      'property' => 'test', 
     ); 
    } 
} 

$my_object = new A(); 
echo $my_object->a->property; // should show 'test' 
  • 實例化之後,但是這是可以的類實例化過程中完成(構造函數)或更高版本,例如

    你不能直接在構造函數或其他方法之外的類定義中分配對象,因爲你可以只用標量(例如。整數,字符串等)。

  • 6

    只是我的首選解決方案,即使別人已經說明一切:注射

    class A { 
        public $a; 
        public function __construct (ErrorVO $a) { 
        $this->a = $a; 
        } 
    } 
    

    這樣可以使類可測試並允許更換想要ErrorVO - 實施非常容易。當然你也可以這兩個解決方案合併成一個

    class A { 
        public $a; 
        public function __construct (ErrorVO $a = null) { 
        $this->a = is_null($a) ? new ErrorVO : $a; 
        } 
    } 
    

    次要更新:在此期間,你可以這樣寫

    class A { 
        public $a; 
        public function __construct (ErrorVO $a = null) { 
        $this->a = $a ?: new ErrorVO; 
        } 
    } 
    

    第二個例子中它更爲簡潔和國際海事組織它使意圖更加清晰。比較?: -operator與MySQL COALESCE

    +0

    謝謝,它會幫助很多=) – Gerep 2011-05-13 18:29:46

    +0

    很好的例子。很有幫助。謝謝。 – 2015-04-10 16:52:32