PHP: объявить переменную класса объектом stdClass

Это, наверное, довольно просто, но я не смог понять, как сформулировать вопрос для Google, так вот:

Итак, я часто делаю что-то вроде этого...

class foo {
    private $bar = array();
}

... чтобы установить свойство класса как массив. Тем не менее, я хотел бы сделать частную собственность вместо объекта, что-то вроде этого:

class foo {
    private $bar = new stdClass();
}

Я попробовал несколько вариантов этого, и никто из них не работал. Это можно сделать? Для бонусных очков вы можете назначить частное свойство любым другим классом объекта?

Спасибо!

Ответы

Ответ 1

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

class Foo {

  private $bar;

  private $baz;

  public function __construct() {

    $this->bar = new stdClass();
    $this->baz = new Bat();

  }

  public function __get($key) {
      if(isset($this->$key) {
        return $this->$key;
      }

      throw new Exception(sprintf('%s::%s cannot be accessed.', __CLASS__, $key));
  }

}


$foo = new Foo();

var_dump($foo->bar);
var_dump($foo->bat);

И когда вы расширяете класс и должны переопределять конструктор, но все же хотите, чтобы материал в конструкторе родительских классов:

class FooExtended
{
   protected $coolBeans;

   public function __construct() {

      parent::__construct(); // calls the parents constructor

      $this->coolBeans = new stdClass();
   }
}

$foo = new FooExtended();

var_dump($foo->bar);
var_dump($foo->bat);
var_dump($foo->coolBeans);

Следует также отметить, что это не имеет ничего общего с видимостью свойства... неважно, есть ли его protected, private или public.