Свойство PHP как объект
Можно ли установить свойство класса как объекта?
Как
class User {
public $x = "";
public $y = new ErrorVO();
public $w = new array();
}
Ответы
Ответ 1
В конструкторе да.
class User
{
public $x = "";
public $y = null;
public $w = array();
public function __construct()
{
$this->y = new ErrorVO();
}
}
Edit
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());
Ответ 2
Просто мое предпочтительное решение, даже если другие уже все объясняют: 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;
}
}
Это немного более компактно, и это делает его более понятным. Сравните ?:
-оператор с MySQL COALESCE
Ответ 3
Вы не можете объявить их в объявлениях свойств, но вы можете создать их в конструкторе __construct()
. array()
может быть создан в public $w
без ключевого слова new
: public $w = array();
public function __construct()
{
$this->y = new ErrorVO();
}
Ответ 4
Да, это так. Но это может быть сделано во время создания экземпляра класса (в конструкторе) или позже, например:
-
во время создания экземпляра:
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'
Вы не можете назначить объект непосредственно в определении класса вне конструктора или других методов, потому что вы можете сделать это только со скалярами (например, целыми числами, строками и т.д.).