PHP: объявить переменную класса как объект stdClass - PullRequest
15 голосов
/ 29 сентября 2010

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

Итак, я часто делаю что-то подобное ...

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

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

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

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

Спасибо!

1 Ответ

20 голосов
/ 29 сентября 2010

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

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.

...