https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings
https://wiki.php.net/rfc/unicode_escape
错误处理的变化
现在有两个异常类: Exception 和 Error 。这两个类都实现了一个新接口: Throwable 。在异常处理代码中的类型指示也许需要修改来处理这种情况。
一些致命错误和可恢复的致命错误现在改为抛出一个 Error 。由于 Error 是一个独立于 Exception 的类,这些异常不会被已有的 try/catch 块捕获。
可恢复的致命错误被转换为一个异常,所以它们不能在错误处理里面悄悄的忽略。部分情况下,类型指示失败不再能忽略。
解析错误现在会生成一个 Error 扩展的 ParseError 。除了以前的基于返回值 / errorgetlast() 的处理,对某些可能无效的代码的 eval() 的错误处理应该改为捕获 ParseError 。
内部类的构造函数在失败时总是会抛出一个异常。以前一些构造函数会返回 NULL 或一个不可用的对象。
一些 E_STRICT 提示的错误级别改变了。
相关 RFC:
https://wiki.php.net/rfc/engine_exceptions_for_php7
https://wiki.php.net/rfc/throwable-interface
https://wiki.php.net/rfc/internal_constructor_behaviour
https://wiki.php.net/rfc/reclassify_e_strict
其它的语言变化
静态调用一个不兼容的 $this 上下文的非静态调用的做法不再支持。这种情况下,$this 是没有定义的,但是对它的调用是允许的,并带有一个废弃提示。例子:
class A { public function test() { var_dump($this); } } // 注意:没有从类 A 进行扩展 class B { public function callNonStaticMethodOfA() { A::test(); } } (new B)->callNonStaticMethodOfA();
// 废弃:非静态方法 A::test() 不应该被静态调用
// 提示:未定义的变量 $this
NULL
注意,这仅出现在来自不兼容上下文的调用上。如果类 B 扩展自类 A ,调用会被允许,没有任何提示。
不能使用下列类名、接口名和特殊名(大小写敏感):
bool
int
float
string
null
false
true
这用于 class/interface/trait 声明、 class_alias() 和 use 语句中。
此外,下列类名、接口名和特殊名保留做将来使用,但是使用时尚不会抛出错误:
resource
object
mixed
numeric
yield 语句结构当用在一个表达式上下文时,不再要求括号。它现在是一个优先级在 “print” 和 “=>” 之间的右结合操作符。在某些情况下这会导致不同的行为,例如:
echo yield -1;
// 以前被解释如下
echo (yield) - 1;
// 现在被解释如下
echo yield (-1);
yield $foo or die;
// 以前被解释如下
yield ($foo or die);
// 现在被解释如下
(yield $foo) or die;
这种情况可以通过增加括号来解决。
移除了 ASP (<%) 和 script (<script language=php>) 标签。
RFC: https://wiki.php.net/rfc/remove_alternative_php_tags
不支持以引用的方式对 new 的结果赋值。
不支持对一个来自非兼容的 $this 上下文的非静态方法的域内调用。细节参见: https://wiki.php.net/rfc/incompat_ctx 。
不支持 ini 文件中的 # 风格的备注。使用 ; 风格的备注替代。
$HTTP_RAW_POST_DATA 不再可用,使用 php://input 流替代。
标准库的变化
call_user_method() 和 call_user_method_array() 不再存在。
在一个输出缓冲区被创建在输出缓冲处理器里时, ob_start() 不再发出 E_ERROR,而是 E_RECOVERABLE_ERROR。
改进的 zend_qsort (使用 hybrid 排序算法)性能更好,并改名为 zend_sort。
增加静态排序算法 zend_insert_sort。
移除 fpm-fcgi 的 dl() 函数。
setcookie() 如果 cookie 名为空会触发一个 WARNING ,而不是发出一个空的 set-cookie 头。
其它
Curl:
去除对禁用 CURLOPT_SAFE_UPLOAD 选项的支持。所有的 curl 文件上载必须使用 curl_file / CURLFile API。
Date:
从 mktime() 和 gmmktime() 中移除 $is_dst 参数
DBA
如果键也没有出现在 inifile 处理器中,dba_delete() 现在会返回 false。
GMP
现在要求 libgmp 版本 4.2 或更新。
gmp_setbit() 和 gmp_clrbit() 对于负指标返回 FALSE,和其它的 GMP 函数一致。
Intl:
移除废弃的别名 datefmt_set_timezone_id() 和 IntlDateFormatter::setTimeZoneID()。替代使用 datefmt_set_timezone() 和 IntlDateFormatter::setTimeZone()。
libxml:
增加 LIBXML_BIGLINES 解析器选项。从 libxml 2.9.0 开始可用,并增加了在错误报告中行号大于 16 位的支持。
Mcrypt