Можно ли построить такую конструкцию. Скажем, у меня есть массив вроде этого:
$names = array ('name1', 'name2', 'name3'); $values = array ('value1', 'value2', 'value3');
И тогда я хочу сделать следующее:
foreach ($names as $field) { $this->$field = $values[$counter]; $counter ++; }
Так что позже я могу получить доступ к указанному объекту следующим образом:
$var1 = $object->name1; $var2 = $object->name2; // produces "value1" echo $var1; // produces "value2" echo $var2;
То, что я хочу сделать, – это иметь объект, который имеет динамически названные поля. Возможно ли это с помощью OO PHP?
Да, ты можешь
$object = (object)array_combine($names , $values);
Как было предложено @Sam, метод Magic __set работает лучше
Да, это сработает, но обычно переменные переменные не рекомендуется.
Возможно, более элегантным решением было бы использовать метод __get magic в классе следующим образом:
class Person { public function __construct($vars) { $this->vars = $vars; } public function __get($var) { if (isset($this->vars[$var])) { return $this->vars[$var]; } return null; } }
Тогда массив варов будет работать так:
$vars = array( 'name1' => 'value1', 'name2' => 'value2', 'name3' => 'value3', ); $object = new Person($vars);
Или, если вы специально хотите построить его из двух массивов:
$vars = array_combine($names, $values)
Используя специально сконфигурированный ArrayObject , вы можете получить доступ к элементам, используя либо синтаксис:
$object = new ArrayObject(array_combine($names, $values), ArrayObject::ARRAY_AS_PROPS); echo $object->name1; // value1 echo $object['name1']; // value1