PHP7 常用新特性
1.标量类型声明
PHP是一种弱类型的编程语言,因此没有提供任何方法来指定输入参数和返回值的类型,PHP7突破了这种现状,增加了对标量类型(int,float,string,bool)的声明支持,增加declare(strict_types=1)指令声明是否严格类型校验,来看一段代码:
declare(strict_types=1)
function add(int $x, int $y) : int
{
return $x+ $y;
}
echo add(1, 2); //int(7)
有效的类型有:class/interfacename, self, array, callable, bool, float, int and string.
如果不开启strict_type,PHP将会尝试帮你转换成要求的类型,而开启之后,会改变PHP就不再做类型转换,类型不匹配就会抛出错误。
2. ?? ——NULL合并运算符
PHP7中添加了NULL合并运算符,不要小看这个“??”,有了它我们就能很方便的获取一个参数,并能在其为空的情况下提供一个默认值。如何??运算符左侧值存在并且不为NULL,则返回左侧,否则将返回其右侧值。
<?php
// 获取user参数的值(如果为空,则用'nobody')
// PHP5中我们这样来实现:
$username = isset($_GET['user']) ? $_GET['user'] :'nobody';
// PHP7中,使用??运算符更便捷:
$username = $_GET['user'] ?? 'nobody';
?>
3.匿名类
匿名类顾名思义没有类名称,其声明和实例化是同时的,PHP7 支持通过 new class 来实例化一个匿名类,可以用来替代一些"用后即焚"的完整类定义。
echo (new class() {
publicfunction myMethod() {
return"Hello!";
}
})->myMethod();
//Result: Hello!
4.定义数组常量
define('MYCONSTANT', array('a','b','c'));
5.结合比较运算符(<=>)
用于比较两个表达式。当$a 大于、等于或小于$b 时它分别返回1、0或-1
// PHP 7之前的写法:比较两个数的大小
function func ( $ a , $ b ) {
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}
// PHP新增的操作符 <=>
function func ( $ a , $ b ) {
return $a <=> $b;
}
6.一次捕捉多种类型的异常 / 错误
PHP 7.1 新添加了捕获多种异常/错误类型的语法——通过竖杠“|”来实现。
try {
throw new LengthException("LengthException");
// throw new DivisionByZeroError("DivisionByZeroError");
// throw new Exception("Exception");
} catch (\DivisionByZeroError | \LengthException $e) {
echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
} catch (\Exception $e) {
echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
} finally {
// ...
}
7.use 组合声明
use 组合声明可以减少 use 的输入冗余。
use PHPGoodTaste\Utils\{
Util,
Form,
Form\Validation,
Form\Binding
};
8. 更多的Error变为可捕获的Exception
PHP7实现了一个全局的throwable接口,原来的Exception和部分Error都实现了这个接口(interface), 以接口的方式定义了异常的继承结构。于是,PHP7中更多的Error变为可捕获的Exception返回给开发者,如果不进行捕获则为Error,如果捕获就变为一个可在程序内处理的Exception。这些可被捕获的Error通常都是不会对程序造成致命伤害的Error,例如函数不存。PHP7进一步方便开发者处理,让开发者对程序的掌控能力更强。因为在默认情况下,Error会直接导致程序中断,而PHP7则提供捕获并且处理的能力,让程序继续执行下去,为程序员提供更灵活的选择。
例如,执行一个我们不确定是否存在的函数,PHP5兼容的做法是在函数被调用之前追加的判断function_exist,而PHP7则支持捕获Exception的处理方式。