PHP7 新增特性
一、性能与底层
php7 最显著的变化就是性能的极大提升,PHP7速度是 PHP5.6 的两倍,PHP7在语言上也有一些变化,比如添加返回类型声明、增加了一些新的保留关键字等。在安全方面,去除了PHP安全模式,添加魔术引号等。
二、新特性
1、类型声明
现在php的标量有两种模式: 强制 (默认) 和严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。在旧版中,函数的参数申明只能是(Array $arr)、(CLassName $obj)等,基本类型比如Int,String等是不能够被申明的。
强制模式
php7之前的使用方式:
class MyInfo { public $a = 123; public function getInfo(array $a, $b) { var_dump($a, $b); } } function getClass(MyInfo $a) { var_dump($a->a); }
强制模式会把数据转换为指定的数据类型
php7使用方式:
class MyInfo { public $a = 123; public function get1(bool $b) { var_dump($b); } public function get2(int $b) { var_dump($b); } public function get3(string $b) { var_dump($b); } public function get4(float $b) { var_dump($b); } public function get5(array $b) { var_dump($b); } }
严格模式
<?php declare(strict_types=1);
就进入严格模式,参数必须符合规定(必须传入指定数据类型的值),不然报错。
2、返回值类型
php7之前的函数是没有返回值类型的,return啥类型,就是啥类型。
php7中增加了返回值类型,return的类型可以是以下这些:bool、int、string、float、array、class。
语法:
function 函数名称() : 返回类型{ }
示例:
function returnInfo ($a) : array { return $a; } var_dump(returnInfo([1,2,3]));
3、null合并运算符 (??)
如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
示例:
//php version = 7 $username = $user ?? 'nobody'; //php version < 7 得这样使用: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
注意:
$a ?: $b的意思是 $a为true时,直接返回$a, 否则返回$b
$a ?? $b的意思是 $a isset($a)为true, 且不为NULL, 就返回$a, 否则返回$b。
示例:
$user = 0; $username = $user ?? 'nobody'; echo $username; //输出 0,因为 0 存在 且 不为NULL。 $username = $user ?: 'nobody'; echo $username; //输出 'nobody',因为 0 为 false
4、组合比较符
<=>用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。
示例:
// Integers echo 1 <=> 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 // Floats echo 1.5 <=> 1.5; // 0 echo 1.5 <=> 2.5; // -1 echo 2.5 <=> 1.5; // 1 // Strings echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1
5、通过define()定义常量数组
示例:
define ('AWS' , [12,33,44,55]);
6、匿名类
现在已经支持通过new class 来实例化一个匿名类,这可以用来替代一些用后即焚的完整类定义。
interface Logger { public function log(string $msg); } class Application { private $logger; public function getLogger(): Logger { return $this->logger; } public function setLogger(Logger $logger) { $this->logger = $logger; } } $app = new Application; $app->setLogger(new class implements Logger { public function log(string $msg) { echo $msg; } }); var_dump($app->getLogger());
7、Unicode codepoint 转译语法
这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的。
echo "\u{0000aa}"; echo "\u{aa}"; //省略了开头的0 echo "\u{9999}";
8、Closure::call() 闭包
class A {private $x = 1;} // php 7之前: $getXCB = function() {return $this->x;}; $getX = $getXCB->bindTo(new A, 'A'); // intermediate closure echo $getX(); // PHP 7: $getX = function() {return $this->x;}; echo $getX->call(new A);
9、为unserialize()提供过滤
现在php7中unserialize会变得更佳好用,它多了一个参数,用来反序列化包涵class的过滤不需要的类,变的更加安全。
10、IntlChar
新增加的 IntlChar(http://php.net/manual/zh/class.intlchar.php) 类旨在暴露出更多的 ICU 功能。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。
printf('%x', IntlChar::CODEPOINT_MAX); echo IntlChar::charName('@'); var_dump(IntlChar::ispunct('!'));