类型声明:
函数入参和出参支持声明类型:
declare(strict_types=1); // 严格限制入参类型
function test(int $num) : int
{
return $num * $num;
}
var_dump(test('66')); //这个会报错
strict_types/declare()指令
默认情况下,所有的PHP文件都处于弱类型校验模式。新的declare指令,通过指定strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。
declare(strict_types=1)必须是文件的第一个语句。如果这个语句出现在文件的其他地方,将会产生一个编译错误,块模式是被明确禁止的。
类似于encoding指令,但不同于ticks指令,strict_types指令只影响指定使用的文件,不会影响被它包含(通过include等方式)进来的其他文件。该指令在运行时编译,不能修改。它的运作方式,是在opcode中设置一个标志位,让函数调用和返回类型检查符合类型约束。
命名空间批量声明
use Publish\{
Book\Paper,
Course\Name,
Users\Sex
}
老式构造方法废弃
使用与类名同名的函数作为构造函数这种方式不推荐使用,将会在未来版本中移除。
Throwable接口
异常(Exception)和绝大部分错误(Fatal)都能通过 try/catch 的方式予以捕获并处理(继承自 Throwable 接口):
try {
$a = 20;
$result = $a / 0;
} catch (EngineException $e) {
echo $e->getMessage();
}
新的操作符
<=>
用于对参数进行比较时很方便:
两边相等返回0
左边小于右边返回-1
左边大于右边返回1
??
//三元运算符的优化,以前需要这么写:
$name = isset($_POST['name']) ? $_POST['name'] : NULL;
//现在可以这么写:
$name = $_POST['name'] ?? NULL;
统一变量语法
/*为了解决 $$first['name'] 这种写法容易造成语法混淆,引入统一变量语法,这种写法需要改为:*/
${$first['name']}
//即将优先执行的部分用花括号括起来,否则会报错,并且得到不确定的输出。
其它新特性
常量数组
define('com', ['google', 'baidu', '360']);
print(com[1]);
switch不再支持多个默认值
switch(true)
{
default:
echo '1';
break;
default:
echo '2';
}
以上代码在 PHP 7 中会报错:
Fatal error: Switch statements may only contain one default …
session_start函数调整
支持传递配置参数以覆盖 php.ini 中的默认配置。
unserialize引入过滤器
为了安全起见,在该函数中引入过滤器,以限定可以反序列化的对象。