PHP: Как создать переменные объекта?

Так, например, у меня есть этот код:

class Object{
    public $tedi;
    public $bear;
    ...some other code ...
}

Теперь, как вы видите, в этом классе есть общедоступные переменные. То, что я хотел бы сделать, - это сделать эти переменные динамически, с функцией что-то вроде:

private function create_object_vars(){

   // The Array what contains the variables
   $vars = array("tedi", "bear");

   foreach($vars as $var){
      // Push the variables to the Object as Public
      public $this->$var;
   }
}

Итак, как я должен создавать общедоступные переменные динамическим способом?

Ответ 1

Да, вы можете это сделать.

Вы в значительной степени верны - это должно сделать это:

private function create_object_vars(){

   // The Array of names of variables we want to create
   $vars = array("tedi", "bear");

   foreach($vars as $var){
      // Push the variables to the Object as Public
      $this->$var = "value to store";
   }
}

Обратите внимание, что это использует имя переменной переменной, которая может делать некоторые сумасшедшие и опасные вещи!

В соответствии с комментариями члены, созданные таким образом, будут общедоступны - я уверен, что есть способ создания защищенных/закрытых переменных, но это, вероятно, не просто (например, вы могли бы сделать это с помощью C Zend API в расширении).

Ответ 2

$vars = (object)array("tedi"=>"bear");

или

$vars = new StdClass();
$vars->tedi = "bear";

Ответ 3

В качестве альтернативы вы также можете получить свой объект из ArrayObject. Таким образом, он наследует поведение массива и несколько методов, облегчающих впрыскивание атрибутов.

class YourObject extends ArrayObject {

    function __construct() {
        parent::__construct(array(), ArrayObject::PROPS_AS_ARRAY);
    }

    function create_object_vars() {
        foreach ($vars as $var) {

            $this[$var] = "some value";

        }
    }

Атрибуты будут тогда доступны как $this->var и $this["var"] аналогично, что может или не может соответствовать варианту использования. Альтернативным методом установки атрибутов будет $this->offsetSet("VAR", "some value");.

Btw, нет ничего плохого в переменных переменных. Они являются правильной конструкцией языка, так как будут повторно использовать ArrayObject.