Php 使用数组键向对象添加属性
有没有可能有这样的结构。假设我有这样一个数组:Php 使用数组键向对象添加属性,php,oop,Php,Oop,有没有可能有这样的结构。假设我有这样一个数组: $names = array ('name1', 'name2', 'name3'); $values = array ('value1', 'value2', 'value3'); $var1 = $object->name1; $var2 = $object->name2; // produces "value1" echo $var1; // produces "value2" echo $var2; 然后我想做以下几点:
$names = array ('name1', 'name2', 'name3');
$values = array ('value1', 'value2', 'value3');
$var1 = $object->name1;
$var2 = $object->name2;
// produces "value1"
echo $var1;
// produces "value2"
echo $var2;
然后我想做以下几点:
foreach ($names as $field) {
$this->$field = $values[$counter];
$counter ++;
}
这样以后,我可以像这样访问所述对象:
$names = array ('name1', 'name2', 'name3');
$values = array ('value1', 'value2', 'value3');
$var1 = $object->name1;
$var2 = $object->name2;
// produces "value1"
echo $var1;
// produces "value2"
echo $var2;
我想做的是有一个对象,它具有动态命名的字段。这在OO PHP中是可能的吗?是的,您可以
$object = (object)array_combine($names , $values);
正如@Sam所建议的,这种方法效果更好是的,你可以
$object = (object)array_combine($names , $values);
正如@Sam所建议的那样,这种方法效果更好是的,这会起作用,但通常不鼓励使用可变变量 也许更优雅的解决方案是在类上使用,如下所示:
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阵列将按如下方式工作:
$vars = array(
'name1' => 'value1',
'name2' => 'value2',
'name3' => 'value3',
);
$object = new Person($vars);
或者,如果您特别希望从两个阵列构建它:
$vars = array_combine($names, $values)
是的,这是可行的,但通常不鼓励使用可变变量 也许更优雅的解决方案是在类上使用,如下所示:
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阵列将按如下方式工作:
$vars = array(
'name1' => 'value1',
'name2' => 'value2',
'name3' => 'value3',
);
$object = new Person($vars);
或者,如果您特别希望从两个阵列构建它:
$vars = array_combine($names, $values)
使用特殊配置的,您可以使用以下任一语法访问成员:
$object = new ArrayObject(array_combine($names, $values), ArrayObject::ARRAY_AS_PROPS);
echo $object->name1; // value1
echo $object['name1']; // value1
使用特殊配置的,您可以使用以下任一语法访问成员:
$object = new ArrayObject(array_combine($names, $values), ArrayObject::ARRAY_AS_PROPS);
echo $object->name1; // value1
echo $object['name1']; // value1
是的。你没试过吗?尽管上面的代码不起作用,因为您需要执行
foreach($k=>name)$this->$name=$values[$k]
@DaveRandom:code与$counter
一起工作。不是我想的方式,但是结果是一样的。我想这个问题已经在这里得到了回答:@webbiedave,除非你先创建一个值为零的$counter
变量,否则这肯定行不通?我绝对肯定它在第一次迭代中不会起作用…@DaveRandom:没错。因为他只显示代码片段,我只是假设它在循环之前就初始化了。是的。你没试过吗?尽管上面的代码不起作用,因为您需要执行foreach($k=>name)$this->$name=$values[$k]
@DaveRandom:code与$counter
一起工作。不是我想的方式,但是结果是一样的。我想这个问题已经在这里得到了回答:@webbiedave,除非你先创建一个值为零的$counter
变量,否则这肯定行不通?我绝对肯定它在第一次迭代中不会起作用…@DaveRandom:没错。因为他只显示代码片段,所以我假设它在循环之前就已经初始化了。谢谢!这是一个很好的解决方案:)谢谢!这是一个很好的解决方案:)