Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用数组键向对象添加属性_Php_Oop - Fatal编程技术网

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:没错。因为他只显示代码片段,所以我假设它在循环之前就已经初始化了。谢谢!这是一个很好的解决方案:)谢谢!这是一个很好的解决方案:)