PHP8 新特性解讀和示例

A-big-beard發表於2021-12-01

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 協議》,轉載必須註明作者和本文連結

相關文章