我写了一些代码:
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'];呢?