在PHP语言规范中,“[”如何成为运算符?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

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

提问于
用户回答回答于

1.在两者之间的优先权.

首先,PHP在查看[,因为括号需要关闭一个才能与之一起,所以中间的每个操作符都优先于开始括号。

例子:

$a[1+2]

+有优先权,即第一位1+2必须在PHP确定要从哪个元素检索之前对其进行评估。$a

但是操作符优先列表并不是关于这个的。

2.n.结合性

第二,计算连续对的顺序是[]就像这里:

$b[1][2]

PHP将首先评估$b[1]然后申请[2]为了那个。这是从左到右的评估,也是我们的目的。左结合性

但问题并不在于结合性,而在于其他算子的优先性。

3.优先于左侧的运算符

名单上说clonenew运算符优先于[,这是不容易测试的。

首先,要组合的大部分构造new带有方括号的语法被认为是无效的。例如,这两种说法:

$a = new myClass()[0];
$a = new myClass[0];

将产生一个解析错误:

语法错误,意外的‘[’‘

PHP需要添加括号才能使语法有效。所以我们不可能像这样测试优先级规则。

但是还有另一种方法,通过使用包含类名的变量:

$a = new $test[0];

有效的语法,但现在的挑战是创建一个创建类似数组的类。

这样做并不容易,因为引用了一个对象属性,如下所示:obj->prop,不像obj["prop"]

所以我想出了这个设置,定义了两个类似的类:

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;

此语句创建一个新的n.TestClass实例,然后需要将其转换为字符串,因此__托斯特林方法调用该新实例,该实例返回:

我是TestClass对象

这是预料中的情况。

试验2

echo (new $test)[0];

这里,我们从相同的操作开始,因为括号强制new首先执行的操作。这一次,PHP不会将创建的对象转换为字符串,而是从它请求数组元素0。此请求由偏移量方法,因此上面的语句输出:

我是TestClass对象的数组元素

试验3

echo new ($test[0]);

其想法是强制执行相反的顺序。遗憾的是,PHP不允许这种语法,因此必须将语句分成两部分,以便获得预期的计算顺序:

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

所以现在[的值的第一个字符。$测试,即.“T”,然后new也适用于此。这就是为什么我也定义了一个T型上课。大echo打电话__托斯特林在这种情况下,产生:

我是T对象

现在来了最后一个测试,看看在没有括号的情况下,哪种顺序是正确的:

试验4

echo new $test[0];

4.结语

产出如下:

我是T对象

因此,实际上,PHP应用了[new运算符

5.比较clone带着new

clone运算符与[。奇怪的是,clonenew在语法规则方面并不完全平等。重复测试2clone:

echo (clone $test)[0];

产生一个解析错误:

语法错误,意外的‘[’‘

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

用户回答回答于

它只意味着数组变量(左关联-$First)将在数组键(右关联-$秒)之前进行计算。

$first[$second]

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

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

扫码关注云+社区

领取腾讯云代金券