類型宣告 看程式碼,一目了然了。 class person { public function age(int $age) : string { return 'Age is ' . $age; } } 命名空間與use關鍵字批次宣告 非混合模式 use Publishers\Packt\{ Book, Ebook, Video}; use function Publishers\Packt\{ getBook, saveBook }; use const Publishers\Packt\{ COUNT, KEY }; 混合模式 use Publishers\Packt\{ Book, Ebook, Video, function getBook, function saveBook, const COUNT, const KEY }; 複合模式 use Publishers\Packt\{ Paper\Book, Electronic\Ebook, Media\Video }; 匿名類別 匿名類別的宣告與使用時同時進行的,具備其他類別所具備的所以功能,差別在於匿名類別沒有類別名稱。語法如下: new class(argument) { definition }; 匿名類別是沒有類別名稱的,但在PHP內部,會在記憶體的參考位址表中為其分配一個全域唯一的名稱。 $name = new class('You') { public function __construct($name) { echo $name; } }; 匿名類別可以繼承父類別及父類別的方法。 class Packt { protected $number; public function __construct() { echo 'parent construct'; } public function getNumber() : float { return $this->number; } } $number = new class(5) extends Packt { public function __construct(float $number) { parent::__construct(); $this->number = $number; } }; echo $number->getNumber(); 匿名類別可以繼承介面。 interface Publishers { public function __construct(string name, string address); public function getName(); public function getAddress(); } class packt { protected $number; protected $name; protected $address; public function ... } $info = new class('name', 'address') extends Packt implement Publishers { public function __construct(string $name, string $address) { $this->name = $name; $this->address = $address; } public function getName() : string { return $this->name; } public function getAddress() : string { return $this->address; } } echo $info->getName() . ' ' . $info->getAddress(); 匿名類別可以嵌套在一個類別中使用。 class Math { public $first_number = 10; public $second_number = 10; public function add() : float { return $this->first_number + $this->second_number; } public function mutiply_sum() { return new class() extends Math { public function mutiply(float $third_number) : float { return $this->add() * $third_number; } }; } } $math = new Math(); echo $math->mutiply_sum()->mutiply(2); 摒棄老式建構函數 從PHP4開始,建構子可以透過命名與類別名稱一致的方式來宣告自己是建構函數,在PHP7中這種方式宣告建構子依然可以使用,但不建議使用,會輸出不推薦的資訊Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Packt has a deprecated constructor in ..., PHP7中推薦使用__construct()。 throwable介面 從PHP7開始,程式中的fatal錯誤都可以被截獲,PHP7提供了throwable接口,異常與錯誤都繼承於這個接口。 Error 現在大多數的fatal錯誤情況會拋出一個error實例,類似於截獲異常,error實例可以被try/catch截獲。 try { ... } catch(Error $e) { echo $e->getMessage(); } 有些錯誤狀況只有error的子實例會被拋出,例如 TypeError、DivisionByZeroError、ParseError等。 <=>運算子 <=>運算子將==、< 、>三個比較運算子打包在了一起,具體使用規則如下。 運算子兩邊相等時回傳0運算子左邊小於右邊時回傳-1運算子左邊大於右邊時回傳1 null合併運算子 ?? 合併運算符,在第一運算元存在時可直接傳回,否則傳回第二運算元。 $title = $post['title'] ?? NULL; $title = $post['title'] ?? $get['title'] ?? 'No title'; uniform變數語法 $first = ['name' => 'second']; $second = 'two'; echo $$first['name']; echo ${Sfirst['name']}; // PHP7 ... echo $object->$methods['title']; echo $object->{$methods['title']}; // PHP7 主要是因為PHP7與先前版本PHP的解析方式不一樣,在PHP7中加上花括號就可以啦,就像上邊程式碼這樣,否則會報錯誤。 常數數組 從PHP5.6開始常數數組可以用const關鍵字來聲明,在PHP7中常數數組可以透過define函數來初始化。 const STORES = ['en', 'fr', 'ar']; // php5.6 define('STORES', ['en', 'fr', 'ar']); // php7 switch中的default預設值 在PHP7之前,switch語句中允許多個default預設值,從PHP7開始,只能有一個default預設值,否則會產生fatal級別錯誤。 // php7之前 switch (true) { case 'value': # code... break; default: # code... break; default: # code... break; } // php7 switch (true) { case 'value': # code... break; default: # code... break; } session_start函數中的選項陣列 在PHP7之前,使用session的時候都必須先呼叫session_start()函數,而這個函數並沒有參數需要傳遞,所有session相關的配置都在php.ini檔案中,從PHP7開始,可以在呼叫這個函數時傳遞參數選項數組,這些設定資訊將會覆蓋php.ini中的session配置。 session_start([ 'cookie_lifetime' => 3600, 'read_and_close' => true ]); unserialize函數引入過濾器 unserialize()可以反序列化任何類型的對象,沒有任何過濾項,不安全,PHP7在unserialize()中引入了過濾器,且預設允許反序列化所有類型的物件。 $result = unserialize($object, ['allowed_classes' => ['Book', 'Ebook']]);