PHP 对象运算符优先级 (->)



我写了一些代码:

class a{
public $b=['f'=>'c'];
}
$a=new a;
$b='b';
echo $a->$b['f'];

当我使用cli时,它输出'c',但是当我使用apache http服务器时,抛出一个错误Illegal string offset 'f',所以我不知道->[哪个优先级更高。没有关于 http://php.net->的介绍。我的PHP版本是5.6,使用Windows 10.In Linux cli和httpd将输出"c">

有关->[之间的优先顺序的一般概念,您可能需要在此处查看 PHP7 迁移文档。 我知道你说的是 PHP5,但迁移文档注意到了这一点,因为 PHP5 和 PHP7 之间的行为发生了变化。

为了回答您的问题,$foo->$bar['baz']在 PHP5 中被解释为$foo->{$bar['baz']}。这意味着您的代码应该抛出错误,因为它在使用$b='b';作为$b的定义时尝试访问$b['f']

但是,在 PHP7 中它被解释为($foo->$bar)['baz'],所以在这里它应该按您的预期工作。

你确定你的 CLI 没有使用 PHP7 吗?

你的代码几乎是正确的 - 只需摆脱第二个$!

class a{
public $b=['f'=>'c'];
}
$a=new a;
$b='b';
echo $a->b['f']; // without the $ it works
$x = $a->$b;  // otherwise you need to assign first
echo $x['f']; // now it works
echo $a->{$b}['f']; // or wrapped in curlies

看这里 https://3v4l.org/gZJWt

优先级为 $。换句话说,$x->$b['f'] 首先认为$b是一个数组,因此它会查找不存在的$b['f'],因此您的错误。将大括号放在$b会强制 PHP 首先评估它,给你值 'b',所以它就变成了 $x->b['f'],它存在并因此有效。

echo ($a->$b(['f'];呢?

最新更新