Можно ли установить свойство класса как объекта?
Как
class User {
    public $x = "";
    public $y = new ErrorVO();
    public $w = new array();
}
Можно ли установить свойство класса как объекта?
Как
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();
    }
}
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());
Просто мое предпочтительное решение, даже если другие уже все объясняют: 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
Вы не можете объявить их в объявлениях свойств, но вы можете создать их в конструкторе __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'
Вы не можете назначить объект непосредственно в определении класса вне конструктора или других методов, потому что вы можете сделать это только со скалярами (например, целыми числами, строками и т.д.).