当前位置:  开发笔记 > 编程语言 > 正文

"["如何成为PHP语言规范中的运算符?

如何解决《"["如何成为PHP语言规范中的运算符?》经验,为你挑选了2个好方法。

在http://php.net/manual/en/language.operators.precedence.php网页上,第二个最高优先级包含一个名为的左关联运算符[.

我不明白.是否[用于访问/修改数组条目,如$myArray[23]?我无法想象任何代码片段,我们需要知道其他运算符的"优先级",或者"关联性" [有用的代码片段.



1> trincot..:

这是一个非常有效的问题.

1. [...]之间的优先权

首先,在查看右侧时,PHP应该首先评估的内容从来没有含糊不清[,因为括号需要关闭它,因此中间的每个运算符都优先于开始括号.

例:

$a[1+2]

所述+的优先级,即,第一1 + 2具有待评估之前PHP可以确定从检索的元件$一个.

但运算符优先级列表与此无关.

2.相关性

其次,有一个评估连续对的顺序[],如下所示:

$b[1][2]

PHP将首先评估$b[1]然后应用于[2]此.这是从左到右的评估,是与左关联性的意图.

但手头的问题不在于关联性,而在于关于其他运营商的优先级.

3.优先于左侧的操作员

该列表表明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";

通过这种设置,我们可以测试一些事情.

测试1

echo new $test;

此语句创建一个新的TestClass实例,然后需要将其转换为字符串,因此在该新实例上调用__toString方法,该实例返回:

我是TestClass对象

这是预期的.

测试2

echo (new $test)[0];

这里我们从相同的动作开始,因为括号强制new首先执行操作.这次PHP不会将创建的对象转换为字符串,而是从中请求数组元素0.offsetGet方法回答了此请求,因此上述语句输出:

我是TestClass对象的数组元素

测试3

echo new ($test[0]);

这个想法是强制执行相反的顺序.遗憾的是,PHP不允许这种语法,因此必须将语句分成两部分才能获得预期的评估顺序:

$name = $test[0];
echo new $name;

所以现在[首先执行,取$ test的值的第一个字符 ,即"T",然后new应用于此.这就是我定义T类的原因.该echo呼叫__toString该实例,这将产生:

我是T对象

现在进行最后的测试,看看没有括号的顺序是哪一个:

测试4

echo new $test[0];

这是有效的语法,并且......

4.结论

输出是:

我是T对象

所以事实上,PHP [new运算符之前应用了,尽管运算符优先级表中已经说明了 !

5.比较clonenew

clone经营者具有与组合类似的行为[.奇怪的是,clonenew没有在语法规则方面完全平等.重复测试2 clone:

echo (clone $test)[0];

产生解析错误:

语法错误,意外'['

但测试4重复clone显示[优先于它的节目.

@bishop告知,这再现了长期存在的文档错误#61513:" clone运算符优先级错误".


是的,您的结论再现了一个长期存在的文档错误:https://bugs.php.net/bug.php?id = 61513

2> Maks3w..:

它只是意味着数组变量(左关联 - $ first)将在数组键之前被评估(右关联 - $ second)

$first[$second]

当数组有多个维度时,这很有意义

$first[$second][$third][$fourth]

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有