2010-12-05 2 views
10

Так, например, у меня есть этот код: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; 
    } 
} 

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

+0

Что ваш вопрос? – 2010-12-05 10:29:27

+0

Извините @Pekka, я понимаю, но я прикрепил его до конца :) – Adam 2010-12-05 10:30:43

+0

Из любопытства, почему вы это делаете? – aib 2010-12-05 12:24:02

ответ

7

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

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

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

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

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

5

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

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

или

$vars = new StdClass(); 
$vars->tedi = "bear"; 
Смежные вопросы