PHP: Как создать переменные объекта? - PullRequest
10 голосов
/ 05 декабря 2010

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

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;
   }
}

Так как мне динамически создавать публичные переменные?

Ответы [ 3 ]

37 голосов
/ 23 января 2012
$vars = (object)array("tedi"=>"bear");

или

$vars = new StdClass();
$vars->tedi = "bear";
7 голосов
/ 05 декабря 2010

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

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

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 в расширении).

5 голосов
/ 05 декабря 2010

В качестве альтернативы вы также можете получить свой объект из 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");.

Кстати, нет ничего плохого в переменных переменных.Это правильная языковая конструкция, как и при повторном использовании ArrayObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...