最近手头有个项目要从PHP5.5迁移到PHP7,中间发现一个运算法优先级变更的现象,这里做一下记录,以备将来查询。
以下老的代码在PHP5.5中运行无误:
class A{
public function a(){
$funcMapping = array(
'a1' => 'func1'
, 'a2' => 'func2'
, 'a3' => 'func3'
);
$params['type'] = 'a2';
$params['id'] = 10;
$rs = $this->$funcMapping[$params['type']]($params['id']);
....
}
public function func1(){...}
public function func2(){...}
public function func3(){...}
}
?>
在PHP7中就会报错:属性"A.Array"未被定义;
错误行:
$rs = $this->$funcMapping[$params['type']]($params['id']);
修改代码成如下方式,在PHP7中就正确执行了:
class A{
public function a(){
$funcMapping = array(
'a1' => 'func1'
, 'a2' => 'func2'
, 'a3' => 'func3'
);
$params['type'] = 'a2';
$params['id'] = 10;
$func = $funcMapping[$params['type']]
$rs = $this->$func($params['id']);
....
}
public function func1(){...}
public function func2(){...}
public function func3(){...}
}
?>
结论:在PHP5中对象方法调用运算符->的优先级要低于数组取值[],但是到PHP7中就反过来了。