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

PHP对象运算符优先级(->;),php,Php,我写了一些代码: class a{ public $b=['f'=>'c']; } $a=new a; $b='b'; echo $a->$b['f']; 当我使用cli时,它输出“c”,但当我使用apache http server时,抛出一个错误非法字符串偏移量“f”,因此我不知道->和之间哪个优先级更高[。上没有关于->的介绍。我的PHP版本是5.6,使用windows 10。在Linux cli和httpd中,将输出'c'echo($a->$b)['f'];?您的代

我写了一些代码:

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

当我使用cli时,它输出“c”,但当我使用apache http server时,抛出一个错误
非法字符串偏移量“f”
,因此我不知道
->
之间哪个优先级更高[
。上没有关于
->
的介绍。我的PHP版本是5.6,使用windows 10。在Linux cli和httpd中,将输出'c'

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

您的代码几乎正确-只需去掉第二个$

看这里


优先级被赋予$。换句话说,$x->$b['f']首先认为$b是一个数组,因此它寻找不存在的$b['f'],因此会出现错误。将花括号放在$b周围会迫使PHP首先对其求值,给您值'b',然后变成$x->b['f']

要了解
->
[
之间的优先顺序,您可能需要查看PHP7迁移文档。 我知道您谈论的是PHP5,但是迁移文档注意到了这一点,因为PHP5和PHP7之间的行为发生了变化

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

然而,在PHP7中,它被解释为
($foo->$bar)['baz']
,因此在这里它应该按照您的预期工作


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

echo$a->b['f'];请在b之前不要使用任何美元。这与运算符优先级无关。解释器根本无法说出你在这里的意思-你是想访问变量
$b
,还是
$b['f']
$a->{$b}['f']
将是“正确的”方法。哦,如果您出于开发目的使用CLI,那么也可以在该环境中启用正确的错误报告…@PhilippSander我知道这是可行的,但使用变量会导致这种情况problem@CBroe我启用了错误报告,可能cli和httpd的操作不同。cli通常使用不同的php.ini,所以你也必须在那里启用错误报告。这不是答案,这是一个问题。请在评论部分提出问题。好吧,我认为这是一个答案。如果你使用parentesis,运算符优先级dissapes的问题……对我来说,它是有效的,但我正在用PHP7测试它。echo$a->{$b}['f'];也应该有效。echo$a->{$b}['f'];适用于PHP7和PHP5.5,因此它将适用于PHP5。6@OnekOcli或httpd,您使用的是哪种操作系统?是的,我知道您的代码工作正常,但它没有回答我的问题。我只是稍微更新了一下,我希望这能让您明白并回答您的问题。谢谢您的回答,我想这就是原因。我的cli是7.0,Linux也是PHP7.0。
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