php8新特性

yueSAMA發表於2024-04-22
  1. 命名引數
     1 <?php
     2 function foo($a, $b, $c = 3, $d = 4) {
     3   return $a + $b + $c + $d;
     4 }
     5 //d:40就是命名引數,命名引數可以任意位置傳遞,但不可重複
     6 var_dump(foo(...[1, 2], d: 40)); // 46
     7 var_dump(foo(...['b' => 2, 'a' => 1], d: 40)); // 46
     8 
     9 var_dump(foo(...[1, 2], b: 20)); // Fatal error。命名引數 $b 覆蓋之前的引數
    10 ?>
  2. 註解:註解功能提供了程式碼中的宣告部分都可以新增結構化、機器可讀的後設資料的能力, 註解的目標可以是類、方法、函式、引數、屬性、類常量。 透過 反射 API 可在執行時獲取註解所定義的後設資料。 因此註解可以成為直接嵌入程式碼的配置式語言。(參考hyperf)
  3. 構造器屬性提升
    1 <?php
    2 class Point {
    3     public function __construct(protected int $x, protected int $y = 0) {
    4     }
    5 }
  4. 聯合型別
    1 <?php
    2 function x(int|string $param):int|string{
    3 }
  5. match 表示式: 用於替換if_else語句
    <?php
    $res = match($num){
      1 => "one",
      2 => "two",
        3,4,5  => "3,4,5",
      "2" => 2        
    }
    
    $res = match($num){
      $num < 0 => "-",
      $num > 0 => "+"    
    }
    //在匹配陣列時要陣列順序一致
    $res = match($array){
      ["type" => 1 "name" => 1] => "s"  
    }
  6. nullsafe 運算子 “?->”, 如果鏈條上一個失敗了就返回null
    1 $count = $user?->order?->count
  7. 字串和數字比較更新:數字字串會按照字串比較,非數字字串會把數字轉為字串比較。
    //php8
    0 == "foo"; 失敗會報錯
    //php7
    0 == "foo" true
  8. 列舉類 enum
     1 enum color {
     2   case red;
     3   case green;
     4   case x = “x”;      
     5 }
     6 
     7 print(color::red->name);
     8 print(color::red->value);
     9 print(color::tryFrom("z"));//有z就返回值,沒有返回null
    10 eunm_exists("color") //類是否存在

  9. 只讀型別 readonly
     1 //只讀屬性只能在物件被建立時透過建構函式初始化。一旦設定,它們就不能被更改
     2 class Person {
     3     public function __construct(private readonly string $name) {
     4     }
     5  
     6     public function getName(): string {
     7         return $this->name;
     8     }
     9 }
    10  
    11 $person = new Person("Alice");
    12 echo $person->getName(); // 輸出: Alice

相關文章