Свойство 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'
    

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