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