我有以下课程:
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中听到或读到这样的事情是可能的,但我现在收到错误:
类的对象无法转换为字符串
我错误地认为这可以做到吗?或者有更好的方法吗?
答案 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);
答案 1 :(得分:3)
在用作属性的值周围放置大括号:
$this->{$updateInfo['property']} = $updateInfo[$updateInfo['property']];