PHP 7中成员选择和数组索引优先级的无文档行为更改-这是一个错误吗



根据条令1.2.3中的代码,考虑以下程序。

<?php
class C {
public function func($p) {
printf("In %s with param %sn", __METHOD__, $p);
}
}
printf("PHP version %sn", PHP_VERSION);
$callback = array('callback' => 'func', 'const' => 28);
$record = new C;
$repete = $callback['callback'];
$record->$repete(10);
$record->$callback['callback'](20);

如果我用PHP 5.4.34版本运行它,输出是:

$ /cygdrive/c/xampp1826/php/php.exe foo.php
PHP version 5.4.34
In C::func with param 10
In C::func with param 20

使用PHP 7.4.12:运行

$ /cygdrive/c/xampp7412/php/php.exe foo.php
PHP version 7.4.12
In C::func with param 10
Notice: Array to string conversion in C:cygwin64homerepetefoo.php on line 12
Call Stack:
0.0005     403600   1. {main}() C:cygwin64homerepetefoo.php:0

Notice: Undefined property: C::$Array in C:cygwin64homerepetefoo.php on line
12
Call Stack:
0.0005     403600   1. {main}() C:cygwin64homerepetefoo.php:0

Notice: Trying to access array offset on value of type null in C:cygwin64home
repetefoo.php on line 12
Call Stack:
0.0005     403600   1. {main}() C:cygwin64homerepetefoo.php:0

Fatal error: Uncaught Error: Function name must be a string in C:cygwin64home
repetefoo.php on line 12
Error: Function name must be a string in C:cygwin64homerepetefoo.php on line
12
Call Stack:
0.0005     403600   1. {main}() C:cygwin64homerepetefoo.php:0

这是一个故意的不兼容更改还是一个错误?我看不出它在版本7中被列为不兼容的更改。这似乎是成员select的相对优先级的问题->和数组索引[]运算符。此问题注意到,手册中的操作员中没有列出成员选择。我注意到数组索引也没有列出。

因此,如果手册没有指定优先级,这是否意味着无声地改变行为不是一个错误?无论是行为变化本身,还是没有列出变化,都肯定是一个错误。我是否错过了将此更改列为不兼容的更改?

我不知道到底是哪个版本的PHP引入了更改,我只有5.4.34和7.4.12可供测试。

在@Ulrich Eckhardt对原始帖子的评论的刺激下,我回去仔细阅读了关于PHP 7.0中向后不兼容更改的部分,并在其新旧评估表中发现了这一点:

Old and new evaluation of indirect expressions
Expression  PHP 5 interpretation    PHP 7 interpretation
$$foo['bar']['baz'] ${$foo['bar']['baz']}   ($$foo)['bar']['baz']
$foo->$bar['baz']   $foo->{$bar['baz']} ($foo->$bar)['baz']
$foo->$bar['baz']() $foo->{$bar['baz']}()   ($foo->$bar)['baz']()
Foo::$bar['baz']()  Foo::{$bar['baz']}()    (Foo::$bar)['baz']()

表中的第三行正是示例代码第12行中的情况。所以我收回了我的抱怨,说这是一个没有记录的变化。当然,我仍然可以抱怨,在像Doctrine ORM这样强大的大型PHP库中很难找到这样的案例。但我想这正是我在条令2问世这么长时间后继续使用条令1所付出的代价(据推测,条令2已经修复了PHP 7的任何不兼容之处(。我只是告诉自己去坐在角落里。

由于这基本上是对语言解析方式的改变,可以想象,如果有一个可用的解析器实现,那么让它标记PHP 7以不同方式解析的结构将相对简单。有人知道是否存在这样的工具吗?我使用RapidPHP作为编辑器,使用netbeans进行调试,两者都有一些标记语法错误的功能,但没有人抱怨最初问题中的代码。

相关内容

最新更新