2012-05-28 3 views
0

Возможно ли инициализировать частные или защищенные члены объекта в php с помощью ассоциативного массива.PHP - Инициализация элементов объекта с параметром массива

, например:

class TestClass 
{ 
    public $_name; 
    public $_age; 


    public function __construct(array $params) 
    { 
     ?????? 
    } 
} 


$testClass = new TestClass(
    array(
     'name' => 'Bob', 
     'age' => '29', 
    ) 
); 

мне было интересно, есть ли элегантное решение - возможно, путем реализации одного на УЗД интерфейсов или иначе?

+0

Очевидное решение - это просто '$ this -> _ name = $ params ['name'];' в конструкторе. Что делает ваш объект? Будет ли решение быть чем-то более сложным? –

+0

@ bob-the-destroyer - представленный пример является упрощенным вариантом использования. На самом деле будет множество свойств для установки - все они являются необязательными. –

+0

что-то просто перевернулось бы над '$ this' или' $ params'? Вы упомянули SPL - вы думали, что цель объекта вести себя как массив или что-то еще? –

ответ

2

Вы упомянули SPL. Но, не зная точных требований к цели вашего объекта, ниже приводится единственная информация, которую я могу дать ...

Возможно, ваш объект расширит класс встроенного SPL ArrayIterator. Затем, не обращая внимания на его обработки в конструкторе (уже обрабатываются в классе родительского ArrayIterator), вы можете импортировать массив в ваш объект просто так:

class testClass extends ArrayIterator 
{ 

/* child '__construct' method not required */ 

/* rest of your code here */ 

} 

$t = new testClass(array('name' => 'asdf', 'age' => 99)); 

Имейте в виду, что с присвоенным ArrayIterator поведения, вы не можете позже получите доступ к любому из переданных значений массива, как и к обычному объекту. Вы должны получить доступ к ним, как вы бы массив:

echo $t['name']; // 'asdf' 
echo $t->name; // NULL property unknown error 

И, внутренне, переданный массив хранится в вашем объекте в качестве одного частного storage параметра. В вашем случае у вас уже есть все ваши свойства объекта, предварительно определенные и добавленные с помощью подчеркивания, поэтому вам, вероятно, придется вручную петлевать над $this или $params в любом случае в вашем конструкторе для установки любых реальных свойств объекта.

Вы могли бы, конечно, переопределить все ArrayIterator наследуемые методы вашего ребенка объекта обрабатывать ваше специальное свойство именования дела по get или set, но это, казалось бы излишним и непродуктивным, а не просто цикл над $params/установка $this в любом случае в конструкторе.

public function __construct(array $params) 
    { 
     foreach ($params as $key => $val) { 
      if (property_exists($this, "_$key")) { 
       $this->{"_$key"} = $val; 
      } 
     } 
    } 

Так, просто цикл по $params/установка $this в конструкторе, вероятно, самый лучший, самый простое решение есть.

3
foreach ($params as $key=>$value) 
{ 
$key = '_'.$key; 
$this->$key=$value; 
} 

Смотрите код онлайн для работы образца here

+1

Вот что такое строка '$ key = '_'. $ key' для. Он изменяет «возраст» на «_age» и «имя» на «_name». –

+1

Замените '$ obj' на' $ this'. – flowfree