【问题标题】:Add properties to object using array keys使用数组键向对象添加属性
【发布时间】:2011-11-09 07:14:20
【问题描述】:

有没有可能有这样的构造。假设我有一个这样的数组:

$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 可以做到这一点吗?

【问题讨论】:

  • 是的。你没试过吗?虽然上面的代码行不通,因为你需要做foreach ($names as $k => $name) $this->$name = $values[$k];
  • @DaveRandom:代码适用于$counter。不是我要走的路,但结果是一样的。
  • 我想这个问题已经在这里回答了:stackoverflow.com/questions/829823/…
  • @webbiedave 肯定不行,除非您首先创建值为零的$counter 变量?我绝对肯定它不会在第一次迭代中工作......
  • @DaveRandom:没错。由于他只显示代码 sn-ps 我只是假设它是在循环之前初始化的。

标签: php oop


【解决方案1】:

是的,你可以

$object = (object)array_combine($names , $values);

正如@Sam 所建议的,Magic __set method 效果更好

【讨论】:

  • 谢谢!这是一个很好的解决方案:)
【解决方案2】:

是的,这会起作用,但通常不鼓励使用可变变量。

也许更优雅的解决方案是在类上使用__get magic method,如下所示:

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)

【讨论】:

    【解决方案3】:

    使用特殊配置的ArrayObject,您可以使用任一语法访问成员:

    $object = new ArrayObject(array_combine($names, $values), ArrayObject::ARRAY_AS_PROPS);
    
    echo $object->name1;   // value1
    echo $object['name1']; // value1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多