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

时间:2017-07-31 08:25:30

标签: php

我写了一些代码:

Illegal string offset 'f'

当我使用cli时,它输出'c',但是当我使用apache http服务器时,抛出错误->,所以我不知道[和{{之间的优先级更高1}}。http://php.net上没有关于->的介绍。我的PHP版本是5.6并使用Windows 10.在Linux中,cli和httpd将输出'c'

3 个答案:

答案 0 :(得分:1)

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

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'],它存在并因此起作用。

答案 1 :(得分:1)

有关->[之间优先顺序的一般概念,您可能需要查看PHP7迁移文档here。 我知道你在谈论PHP5,但由于PHP5和PHP7之间的行为发生了变化,因此迁移文档会引起注意。

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

但是,在PHP7中,它被解释为($foo->$bar)['baz'],因此按预期工作。

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

答案 2 :(得分:-3)

回声怎么样($ a-> $ b)['f'];?