PHP8.0 新特性解讀和示例
新增命名引數功能
啥是命名引數?
就是 具名 引數,在呼叫函式的時候,可以指定引數名稱,指定引數名稱後,引數順序可以不安裝原函式引數順序傳.例子:
<?php /** * 計算餘額方法 * @param $amount 賬戶金額 * @param $payment 支出金額 * @return $balance = $amount-$payment 餘額 */ function balance($amount, $payment) { return $amount - $payment; } //傳統方式呼叫 balance(100, 20); //php8 使用命名引數呼叫 balance(amount: 100, payment: 20); //也可以換個順序,這樣來 balance(payment: 20, amount: 100);
註解功能
啥是註解?直接上程式碼,最後在解釋
例子:
#[Attribute] class PrintSomeThing { public function __construct($str = '') { echo sprintf("列印字串 %s \n", $str); } } #[PrintSomeThing("hello world")] class AnotherThing{} // 使用反射讀取註解 $reflectionClass = new ReflectionClass(AnotherThing::class); $attributes = $reflectionClass->getAttributes(); foreach($attributes as $attribute) { $attribute->newInstance(); //獲取註解例項的時候,會輸出 ‘列印字串 Hello world’ }
註解功能個人理解總結,使用註解可以將類定義成一個一個 低耦合,高內聚 的後設資料類。在使用的時候透過註解靈活引入,反射註解類例項的時候達到呼叫的目的。
**註解類只有在被例項化的時候才會呼叫
構造器屬性提升
啥意思呢,就是在建構函式中可以宣告類屬性的修飾詞作用域
例子:<?php // php8之前 class User { protected string $name; protected int $age; public function __construct(string $name, int $age) { $this->name = $name; $this->age = $age; } } //php8寫法, class User { public function __construct( protected string $name, protected int $age ) {} }
節約了程式碼量,不用單獨宣告類屬性了。
聯合型別
在不確定引數型別的場景下,可以使用.
例子:
function printSomeThing(string|int $value) { var_dump($value); }
Match表示式
和switch case差不多,不過是嚴格===匹配
例子:
<?php $key = 'b'; $str = match($key) { 'a' => 'this a', 'c' => 'this c', 0 => 'this 0', 'b' => 'last b', }; echo $str;//輸出 last b
新增 Nullsafe 運算子
<?php class User { public function __construct(private string $name) { //啥也不幹 } public function getName() { return $this->name; } } //不例項 User 類,設定為null $user = null; echo $user->getName();//php8之前呼叫,報錯 echo $user?->getName();//php8呼叫,不報錯,返回空
簡化了 is_null 判斷
本作品採用《CC 協議》,轉載必須註明作者和本文連結