Можно ли установить свойство класса как объекта?
Подобно:
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'
Вы не можете назначать объект непосредственно в определении класса вне конструктора или других методах, потому что вы можете сделать это только со скалярами (например, целыми числами, строками и т. Д.).