gpt4 book ai didi

php - "["怎么可能是 PHP 语言规范中的运算符?

转载 作者:IT王子 更新时间:2023-10-29 00:50:21 25 4
gpt4 key购买 nike

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

我不明白。是不是[用于访问/修改数组条目,如 $myArray[23] ?我无法想象任何代码片段我们需要知道它与其他运算符的“优先级”,或者 [ 的“结合性”在哪里会很有用。

最佳答案

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

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

首先,在查看 PHP 时,PHP 应该首先评估什么永远不会有歧义。
右侧[ ,因为括号需要一个闭合的来配合它,所以
中间的每个运算符都优先于左括号。

例子:

$a[1+2]
+具有优先级,即在 PHP 可以确定哪个之前必须评估第一个 1+2
要从 $a 中检索的元素。

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

2. 关联性

其次是评估连续对 [] 的顺序。 , 像这儿:
$b[1][2]

PHP 会先评估 $b[1]然后申请 [2]到那个。这是从左到右
评估并且是左结合性的目的。

但手头的问题不是关于结合性,而是关于其他运算符的优先级。

3. 左侧运算符的优先级

该列表指出 clonenew运算符优先于 [ ,这不容易测试。

首先,您将组合的大多数结构 new带方括号被视为无效
句法。例如,这两个语句:
$a = new myClass()[0];
$a = new myClass[0];

会给出解析错误:

syntax error, unexpected '['



PHP 要求您添加括号以使语法有效。所以我们没有办法测试
像这样的优先规则。

但是还有另一种方法,通过使用包含类名的变量:
$a = new $test[0];

这是有效的语法,但现在的挑战是创建一个创建某些东西的类
这就像一个数组。

这不是一件容易的事,因为对象属性是这样引用的: obj->prop , 不是
喜欢 obj["prop"] .但是可以使用 ArrayObject class可以处理方括号。这个想法是扩展这个类并重新定义 offsetGet method确保该类的新对象具有要返回的数组元素。

为了使对象可打印,我最终使用了神奇的方法 __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 方法,该方法返回:

I am a TestClass object



这正如预期的那样。

测试 2
echo (new $test)[0];

在这里,我们从相同的操作开始,因为括号强制 new要首先执行的操作。这次 PHP 没有将创建的对象转换为字符串,而是从中请求数组元素 0。此请求由 offsetGet 方法响应,因此上述语句输出:

I am a TestClass object's array element



测试 3
echo new ($test[0]);

这个想法是强制执行相反的顺序。遗憾的是,PHP 不允许这种语法,因此必须将语句分成两部分才能获得预期的评估顺序:
$name = $test[0];
echo new $name;

所以现在 [首先执行,取值的第一个字符
$test,即“T”,然后 new应用于那个。这就是为什么我
还定义了一个 T 类。 echo在该实例上调用 __toString,产生:

I am a T object



现在是最后的测试,看看当没有括号时哪个是顺序:

测试 4
echo new $test[0];

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

4。结论

输出是:

I am a T object



所以其实PHP应用了 [之前 new运营商,尽管在
operator precedence table !

5.比较 clonenew clone运算符与 [ 组合具有类似的行为.奇怪的是, clonenew在语法规则方面并不完全相同。使用 clone 重复测试 2 :
echo (clone $test)[0];

产生解析错误:

syntax error, unexpected '['



但是测试 4 重复了 clone显示 [优先于它。

@bishop 告知,这重现了长期存在的文档错误 #61513: " clone operator precedence is wrong" .

关于php - "["怎么可能是 PHP 语言规范中的运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34694813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com