其他一些不兼容的变更
new 操作符创建的对象不能以引用方式赋值给变量
new 语句创建的对象不能 以引用的方式赋值给变量。
<?php
class C {}
$c =& new C;
?>
以上程序在 PHP 5 中的输出:
Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3
以上程序在 PHP 7 中的输出:
Parse error: syntax error, unexpected 'new' (T_NEW) in /tmp/test.php on line 3
无效的类、接口以及 trait 命名
不能以下列名字来命名类、接口以及 trait:
- bool
- int
- float
- string
- null
- true
- false
此外,也不要使用下列的名字来命名类、接口以及 trait。虽然在 PHP 7.0 中, 这并不会引发错误, 但是这些名字是保留给将来使用的。
- resource
- object
- mixed
- numeric
移除了 ASP 和 script PHP 标签 ¶
使用类似 ASP 的标签,以及 script 标签来区分 PHP 代码的方式被移除。 受到影响的标签有:
被移除的 ASP 和 script 标签
开标签 | 闭标签
-- | --
<%
| %>
<%=
| %>
<script language="php">
| </script>
从不匹配的上下文发起调用
在不匹配的上下文中以静态方式调用非静态方法, 在 PHP 5.6 中已经废弃, 但是在 PHP 7.0 中, 会导致被调用方法中未定义 $this 变量,以及此行为已经废弃的警告。
<?php
class A {
public function test() { var_dump($this); }
}
// 注意:并没有从类 A 继承
class B {
public function callNonStaticMethodOfA() { A::test(); }
}
(new B)->callNonStaticMethodOfA();
?>
以上程序在 PHP 5.6 中的输出:
Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8
object(B)#1 (0) {
}
以上程序在 PHP 7 中的输出:
Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8
Notice: Undefined variable: this in /tmp/test.php on line 3
NULL
yield 变更为右联接运算符
在使用 yield 关键字的时候,不再需要括号, 并且它变更为右联接操作符,其运算符优先级介于 print 和 => 之间。 这可能导致现有代码的行为发生改变:
<?php
echo yield -1;
// 在之前版本中会被解释为:
echo (yield) - 1;
// 现在,它将被解释为:
echo yield (-1);
yield $foo or die;
// 在之前版本中会被解释为:
yield ($foo or die);
// 现在,它将被解释为:
(yield $foo) or die;
?>
可以通过使用括号来消除歧义。
函数定义不可以包含多个同名参数
在函数定义中,不可以包含两个或多个同名的参数。 例如,下面代码中的函数定义会触发 E_COMPILE_ERROR 错误:
<?php
function foo($a, $b, $unused, $unused) {
//
}
?>
Switch 语句不可以包含多个 default 块
在 switch 语句中,两个或者多个 default 块的代码已经不再被支持。 例如,下面代码中的 switch 语句会触发 E_COMPILE_ERROR 错误:
<?php
switch (1) {
default:
break;
default:
break;
}
?>
在函数中检视参数值会返回 当前 的值
当在函数代码中使用 func_get_arg() 或 func_get_args() 函数来检视参数值, 或者使用 debug_backtrace() 函数查看回溯跟踪, 以及在异常回溯中所报告的参数值是指参数当前的值(有可能是已经被函数内的代码改变过的值), 而不再是参数被传入函数时候的原始值了。
<?php
function foo($x) {
$x++;
var_dump(func_get_arg(0));
}
foo(1);
?>
以上程序在 PHP 5 中的输出:
`1`
以上程序在 PHP 7 中的输出:
`2`
$HTTP_RAW_POST_DATA 被移除
不再提供 $HTTP_RAW_POST_DATA 变量。 请使用 php://input 作为替代。
INI 文件中 # 注释格式被移除
在 INI 文件中,不再支持以 # 开始的注释行, 请使用 ;(分号)来表示注释。 此变更适用于 php.ini 以及用 parse_ini_file() 和 parse_ini_string() 函数来处理的文件。
JSON 扩展已经被 JSOND 取代
JSON 扩展已经被 JSOND 扩展取代。 对于数值的处理,有以下两点需要注意的: 第一,数值不能以点号(.)结束 (例如,数值 34. 必须写作 34.0 或 34)。 第二,如果使用科学计数法表示数值,e 前面必须不是点号(.) (例如,3.e3 必须写作 3.0e3 或 3e3)。 另外,空字符串不再被视作有效的 JSON 字符串。
在数值溢出的时候,内部函数将会失败
将浮点数转换为整数的时候,如果浮点数值太大,导致无法以整数表达的情况下, 在之前的版本中,内部函数会直接将整数截断,并不会引发错误。 在 PHP 7.0 中,如果发生这种情况,会引发 E_WARNING 错误,并且返回 null。
自定义会话处理器的返回值修复
在自定义会话处理器中,如果函数的返回值不是 false,也不是 -1, 会引发致命错误。现在,如果这些函数的返回值不是布尔值,也不是 -1 或者 0,函数调用结果将被视为失败,并且引发 E_WARNING 错误。
相等的元素在排序时的顺序问题
由于内部排序算法进行了提升, 可能会导致对比时被视为相等的多个元素之间的顺序不稳定。
注意:在对比时被视为相等的多个元素之间的排序顺序是不可信赖的,即使是相等的两个元素, 他们的位置也可能被排序算法所改变。
错误的使用 break 和 switch 语句
在循环或者 switch 语句之外使用 break 和 continue 被视为编译型错误(之前视为运行时错误),会引发 E_COMPILE_ERROR 错误。
Mhash 不再是一个单独的扩展了
Mhash 扩展已经被完全整合进 Hash 扩展了。 因此,不要再使用 extension_loaded() 函数来检测是否支持 MHash 扩展了, 建议使用 function_exists() 函数来进行检测。 另外,函数 get_loaded_extensions() 以及相关的特性中,也不再报告 和 MHash 扩展相关的信息了。
declare(ticks)
declare(ticks) 指示符不再泄漏到不同的编译单元中。