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('!'));