在http://php.net/manual/en/language.operators.precedence.php网页上,第二个最高优先级包含一个名为的左关联运算符[
.
我不明白.是否[
用于访问/修改数组条目,如$myArray[23]
?我无法想象任何代码片段,我们需要知道其他运算符的"优先级",或者"关联性" [
有用的代码片段.
这是一个非常有效的问题.
首先,在查看右侧时,PHP应该首先评估的内容从来没有含糊不清[
,因为括号需要关闭它,因此中间的每个运算符都优先于开始括号.
例:
$a[1+2]
所述+
的优先级,即,第一1 + 2具有待评估之前PHP可以确定从检索的元件$一个.
但运算符优先级列表与此无关.
其次,有一个评估连续对的顺序[]
,如下所示:
$b[1][2]
PHP将首先评估$b[1]
然后应用于[2]
此.这是从左到右的评估,是与左关联性的意图.
但手头的问题不在于关联性,而在于关于其他运营商的优先级.
该列表表明clone
并且new
运算符优先[
,并且这不容易测试.
首先,大多数new
与方括号结合的结构都被认为是无效语法.例如,这两个陈述:
$a = new myClass()[0]; $a = new myClass[0];
会给出一个解析错误:
语法错误,意外'['
PHP要求您添加括号以使语法有效.所以我们无法像这样测试优先级规则.
但是还有另一种方法,通过使用包含类名的变量:
$a = new $test[0];
这是有效的语法,但现在的挑战是创建一个创建类似于数组的类的类.
这不是一件容易的事,因为对象属性是这样引用的:obj->prop
不是这样的obj["prop"]
.但是,可以使用可以处理方括号的ArrayObject类.我们的想法是扩展此类并重新定义offsetGet方法,以确保该类的新制作对象具有要返回的数组元素.
为了使对象可打印,我最终使用了神奇的方法__toString,当需要将对象强制转换为字符串时执行该方法.
所以我想出了这个设置,定义了两个类似的类:
class T extends ArrayObject { public function __toString() { return "I am a T object"; } public function offsetGet ($offset) { return "I am a T object's array element"; } } class TestClass extends ArrayObject { public function __toString() { return "I am a TestClass object"; } public function offsetGet ($offset) { return "I am a TestClass object's array element"; } } $test = "TestClass";
通过这种设置,我们可以测试一些事情.
echo new $test;
此语句创建一个新的TestClass实例,然后需要将其转换为字符串,因此在该新实例上调用__toString方法,该实例返回:
我是TestClass对象
这是预期的.
echo (new $test)[0];
这里我们从相同的动作开始,因为括号强制new
首先执行操作.这次PHP不会将创建的对象转换为字符串,而是从中请求数组元素0.offsetGet方法回答了此请求,因此上述语句输出:
我是TestClass对象的数组元素
echo new ($test[0]);
这个想法是强制执行相反的顺序.遗憾的是,PHP不允许这种语法,因此必须将语句分成两部分才能获得预期的评估顺序:
$name = $test[0]; echo new $name;
所以现在[
首先执行,取$ test的值的第一个字符
,即"T",然后new
应用于此.这就是我定义T类的原因.该echo
呼叫__toString该实例,这将产生:
我是T对象
现在进行最后的测试,看看没有括号的顺序是哪一个:
echo new $test[0];
这是有效的语法,并且......
输出是:
我是T对象
所以事实上,PHP [
在new
运算符之前应用了,尽管运算符优先级表中已经说明了
!
clone
有new
该clone
经营者具有与组合类似的行为[
.奇怪的是,clone
并new
没有在语法规则方面完全平等.重复测试2 clone
:
echo (clone $test)[0];
产生解析错误:
语法错误,意外'['
但测试4重复clone
显示[
优先于它的节目.
@bishop告知,这再现了长期存在的文档错误#61513:" clone
运算符优先级错误".
它只是意味着数组变量(左关联 - $ first)将在数组键之前被评估(右关联 - $ second)
$first[$second]
当数组有多个维度时,这很有意义
$first[$second][$third][$fourth]