我写了一些代码:
Illegal string offset 'f'
当我使用cli时,它输出'c',但是当我使用apache http服务器时,抛出错误->
,所以我不知道[
和{{之间的优先级更高1}}。http://php.net上没有关于->
的介绍。我的PHP版本是5.6并使用Windows 10.在Linux中,cli和httpd将输出'c'
答案 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
优先权给予$。换句话说,$ 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'];?