PHP7 具有很多用於編寫高性能、高效代碼的新特性,同時也剔除了一些歷史版本中過時的特性。
類型聲明
默認情況下,所有的PHP文件都處於弱類型校驗模式。
<?php
// 1:默認值,表示嚴格類型校驗模式,不符則拋 Fatal error
// 0:表示弱類型校驗模式。
declare(strict_types=1);
// 規定形參、返回值類型
function sum(int ...$ints):int
{
return array_sum($ints);
}
print(sum(1,2,3));
存在意義:聲明類型之後,使得函數、方法的形參與返回值有所預期,並且省去了對數據類型的檢測,提高執行效率。
use 關鍵字批量聲明
PHP 7 可以使用一個 use 從同一個 namespace 中導入類、函數和常量:
// PHP 7 之前版本需要使用多次 use
use some\namespace\ClassA;
use some\namespace\ClassB;
use function some\namespace\fn_a;
use const some\namespace\ConstA;
// PHP 7+ 之後版本可以使用一個 use 導入同一個 namespace 的類
use some\namespace\{ClassA
, ClassB as B
, function fn_a
, const ConstA
};
存在意義:提高了代碼可讀性。
匿名類
匿名類可以用來替代一些"用後即焚"的完整類定義,雖然匿名類沒有命名,但在內存的引用地址表中爲其分配一個全局唯一的名稱。
$name = new class(){
public function __construct()
{
// class@anonymous/Users/atong/htdocs/test.php0x104601063
echo get_class();
}
};
存在意義:匿名類的一次性任務代碼流程對性能提升幫助很大(高性能PHP7 p28)。
不推薦使用老式構造方法
老式的構造函數在PHP7中依然可用,但會產生不被推薦的信息,並且使用 __construct 時,老式的構造函數失效。
class Atong {
public function Atong(){
echo "function atong is called";
}
public function __construct(){
echo "function __construct is called";
}
}
$atong = new Atong();
// function __construct is called
存在意義:統一和規範。
5 Throwable 接口
在PHP 7之前異常可以被截獲,但是錯誤不能被截獲。從PHP 7之後,任何完整程序或者一部分中的Fatal錯誤可以被截獲。
try {
$value = 1 % 0;
} catch (\DivisionByZeroError $e) {
// TODO::記錄日誌
}
echo "it's still running .. ";
存在意義:更合理的異常處理。
太空飛船操作符(<=>)
太空船運算符(組合比較符)在比較變量時非常有用。
// 左大於右時:1
echo (1 <=> 0);
// 兩邊相等時:0
echo (1 <=> 1);
// 右大於左時:-1
echo (1 <=> 2);
存在意義:更少的代碼實現更多的事。
null 合併運算符(??)
空合併運算符可以用來取代三元運算與 isset () 函數。
if(isset($_GET["a"]))
$a = $_GET["a"];
else
$a = "test";
// 等效
$a = isset($_GET["a"]) ? $_GET["a"] : "test";
// 等效
$a = $_GET['a'] ?? "test";
存在意義:和 ?: 一樣,代碼更精簡。
統一變量語法
$first = ["name" => "second"];
$second = "atong";
// Notice ..
echo $$first["name"];
// atong,php7要求的語法規範
echo ${$first["name"]};
存在意義:規範。
常量數組
// php5.6 開始可以使用 const 關鍵字聲明數組常量
const STORES = ['en','fr','ar'];
// php7 常量數組可以通過 define 函數聲明
define("STORES",['en','fr','ar']);
Switch 中的多個默認值
PHP7 之前,多個 default 默認值在 switch語句中是被允許的,PHP7開始,這樣的代碼會產生 Fatal 級別錯誤。
存在意義:規範。
Session_start 函數中的選項數組
PHP7 之前,session_start() 函數沒有參數需要傳遞,session 的配置都在 php.ini 中,PHP 7 之後 session_start() 函數可以接收一個數組作爲參數,可以覆蓋php.ini中session的配置項。
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
Unserialize 函數引入過濾器
通常使用serialize和unserialize兩個方法分別對對象進行序列化和反序列化。然而,unserialize()函數並不安全,因爲沒有任何過濾項,並且可以反序列化任何類型的對象。因此PHP 7引入過濾器,默認情況下允許反序列化所有類型的對象。使用方法如下:
$result = unserilize($object, ['allowed_classes' => ['Packt', 'Books', 'Ebooks']]);
參考:《高性能PHP7,Learning PHP7 High Performance》