使用变量的值作为属性名称

时间:2018-03-02 01:16:51

标签: php

我有以下课程:

class Foo
{
    $bar1 = 'a';
    $bar2 = 'b'

    public function Update($updateInfo)
    {
        $this->$updateInfo['property'] = $updateInfo[$updateInfo['property']];
    }
}

在我的代码中,我创建了一个Foo对象:

$objFoo = new Foo();

现在,我希望能够更新任何一个属性,而不知道更新功能。数组看起来像这样:

$updateInfo['bar1'] = 'newVal';
$updateInfo['property'] = 'bar1';

我记得在PHP中听到或读到这样的事情是可能的,但我现在收到错误:

  

类的对象无法转换为字符串

我错误地认为这可以做到吗?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

您必须使用PHP 7+。这是因为handling of indirect variables, properties, and methods中的向后不兼容的变化。在PHP 5中,您的code works因为它被解释为

$this->{$updateInfo['property']} = $updateInfo[$updateInfo['property']];

这是您的预期行为。但是,在PHP 7+中,它被解释为

($this->$updateInfo)['property'] = $updateInfo[$updateInfo['property']];

因此它会为您提供错误。

使您想要显式的行为在两个版本中都能正常运行:

class Foo
{
    private $bar1 = 'a';
    private $bar2 = 'b';

    public function Update($updateInfo)
    {
        $this->{$updateInfo['property']} = $updateInfo[$updateInfo['property']];
    }
}

$objFoo = new Foo();

$updateInfo['bar1'] = 'newVal';
$updateInfo['property'] = 'bar1';
$objFoo->Update($updateInfo);
var_dump($objFoo);

Demo

答案 1 :(得分:3)

在用作属性的值周围放置大括号:

$this->{$updateInfo['property']} = $updateInfo[$updateInfo['property']];