PHP 7 新特性(完結篇)
這是 PHP 7 、7.1 新特性系列的最後一篇了,至此, 算是對 PHP 7 、7.1 新特性做了一個比較完整的說明。其他兩篇地址如下:
- PHP 7 類型提示
- PHP 7 新增的生成器特性
空合併操作符(Null Coalesce Operator)
直接上例子:
$name = $name ?? "NoName"; // 如果$name有值就取其值,否則設$name成"NoName"n
飛船操作符(Spaceship Operator)
形式:(expr) <=> (expr)
左邊運算對象小,則返回-1;左、右兩邊運算對象相等,則返回0;左邊運算對象大,則返回1。
$name = ["Simen", "Suzy", "Cook", "Stella"];nusort($name, function ($left, $right) {n return $left <=> $right;n});nprint_r($name);n
常量數組(Constant Array)
PHP 7 之前只允許類/介面中使用常量數組,現在 PHP 7 也支持非類/介面的普通常量數組了。
define("USER", [n "name" => "Simen",n "sex" => "Male",n "age" => "38",n "skill" => ["PHP", "MySQL", "C"]n]);n// USER["skill"][2] = "C/C++"; // PHP Fatal error: Cannot use temporary expression in write context in...n
統一了變數語法
$goo = [n "bar" => [n "baz" => 100,n "cug" => 900n ]n];nn$foo = "goo";nn$$foo["bar"]["baz"]; // 實際為:($$foo)[bar][baz]; PHP 5 中為:${$foo[bar][baz]};n // PHP 7 中一個籠統的判定規則是,由左向右結合。n
Throwable 介面
這是 PHP 7 引進的一個值得期待的新特性,將極大增強 PHP 錯誤處理能力。PHP 5 的 try ... catch ... finally 無法處理傳統錯誤,如果需要,你通常會考慮用 set_error_handler() 來 Hack 一下。但是仍有很多錯誤類型是 set_error_handler() 捕捉不到的。PHP 7引入 Throwable 介面,錯誤及異常都實現了 Throwable,無法直接實現 Throwable,但可以擴展 Exception 和 Error 類。可以用 Throwable 捕捉異常跟錯誤。Exception 是所有PHP及用戶異常的基類;Error 是所有內部PHP錯誤的基類。
$name = "Tony";ntry {n $name = $name->method();n} catch (Error $e) {n echo "出錯消息 --- ", $e->getMessage(), PHP_EOL;n}nntry {n $name = $name->method();n} catch (Throwable $e) {n echo "出錯消息 --- ", $e->getMessage(), PHP_EOL;n}nntry {n intdiv(5, 0);n} catch (DivisionByZeroError $e) {n echo "出錯消息 --- ", $e->getMessage(), PHP_EOL;n}n
use 組合聲明
use 組合聲明可以減少 use 的輸入冗餘。
use PHPGoodTasteUtils{n Util,n Form,n FormValidation,n FormBindingn};n
一次捕捉多種類型的異常 / 錯誤
PHP 7.1 新添加了捕獲多種異常/錯誤類型的語法——通過豎杠「|」來實現。
try {n throw new LengthException("LengthException");n // throw new DivisionByZeroError("DivisionByZeroError");n // throw new Exception("Exception");n} catch (DivisionByZeroError | LengthException $e) {n echo "出錯消息 --- ", $e->getMessage(), PHP_EOL;n} catch (Exception $e) {n echo "出錯消息 --- ", $e->getMessage(), PHP_EOL;n} finally {n // ...n}n
可見性修飾符的變化
PHP 7.1 之前的類常量是不允許添加可見性修飾符的,此時類常量可見性相當於 public。PHP 7.1 為類常量添加了可見性修飾符支持特性。總的來說,可見性修飾符使用範圍如下所示:
- 函數/方法:public、private、protected、abstract、final
- 類:abstract、final
- 屬性/變數:public、private、protected
- 類常量:public、private、protected
class YourClass n{n const THE_OLD_STYLE_CONST = "One";nn public const THE_PUBLIC_CONST = "Two";n private const THE_PRIVATE_CONST = "Three";n protected const THE_PROTECTED_CONST = "Four";n}n
iterable 偽類型
PHP 7.1 引入了 iterable 偽類型。iterable 類型適用於數組、生成器以及實現了 Traversable 的對象,它是 PHP 中保留類名。
$fn = function (iterable $it) : iterable {n $result = [];n foreach ($it as $value) {n $result[] = $value + 1000;n }n return $result;n};nn$fn([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);n
可空類型(Nullable Type)
PHP 7.1 引入了可空類型。看看新興的 Kotlin 編程語言的一個噱頭特性就是可空類型。PHP 越來越像「強類型語言了」。對於同一類型的強制要求,可以設置其是否可空。
$fn = function (?int $in) {n return $in ?? "NULL";n};nn$fn(null);n$fn(5);n$fn(); // TypeError: Too few arguments to function {closure}(), 0 passed in ...n
Void 返回類型
PHP 7.1 引入了 Void 返回類型。
function first(): void {n // ...n}nnfunction second(): void {n // ...n return;n}n
最後
最後當然是高呼「PHP是最好的編程語言」。一起來玩PHP吧!
推薦閱讀:
※從 0 開始學習 GitHub 系列之【GitHub 常見的幾種操作】
※【UXRen譯#124】別逗了,我們真的需要會編程的設計師嗎?
※為什麼在Code::Blocks中getchar等於4204520?