Свойство PHP как объект

Можно ли установить свойство класса как объекта?

Подобно:

class User { public $x = ""; public $y = new ErrorVO(); public $w = new array(); } 

В конструкторе, да.

 class User { public $x = ""; public $y = null; public $w = array(); public function __construct() { $this->y = new ErrorVO(); } } 

редактировать

KingCrunch сделал хороший вывод: вы не должны жестко кодировать свои зависимости. Вы должны вводить их в свои объекты (Inversion of Control (IoC)).

 class User { public $x = ""; public $y = null; public $w = array(); public function __construct(ErrorVO $y) { $this->y = $y; } } new User(new ErrorVD()); 

Просто мое предпочтительное решение, даже если другие уже все объясняют: Injection

 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; } } 

Это немного более компактно, и это делает его более ясным. Сравните ?: -оператор с MySQLs COALESCE

Вы не можете объявлять их в объявлениях свойств, но вы можете создавать их в конструкторе __construct() . array() может быть создан в public $w без new ключевого слова: public $w = array();

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

Да. Но это может быть сделано во время создания экземпляра класса (в конструкторе) или позже, например:

  • во время создания:

     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' 
  • после создания экземпляра:

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

Вы не можете назначать объект непосредственно в определении класса вне конструктора или других методах, потому что вы можете сделать это только со скалярами (например, целыми числами, строками и т. Д.).