PHP 8リリース!


PHPは2020年11月26日に新しいバージョンをリリースしました.GNUのような再帰的な頭字語であるPHPはPHPのためのものです.これは、Web開発の分野で最も使用されるバックエンド言語の一つです.現在、新しいWeb開発フレームワークはNodejs、Django、フラスコ、ララベル、Drupalなどのように到着しているが、PHPはバックエンド市場で主要なプレーヤーです.PHPはWeb開発に特に適した汎用スクリプト言語です.それは、1994年にデンマークのカナダのプログラマーRasmus Lerdorfによって、当初つくられました.
PHP開発チームは新しいリリースについて述べました.

"PHP 8.0 is a major update of the PHP language.
It contains many new features and optimizations including named arguments, union types, attributes, constructor property promotion, match expression, nullsafe operator, JIT, and improvements in the type system, error handling, and consistency."


新しいリリースの主な変更点のいくつかは、次のとおりです.
  • 名前付き引数
  • の属性
  • コンストラクタープロパティプロモーション
  • ユニオンタイプ
  • マッチ式
  • nullsafe演算子
  • 内部関数
  • の一貫した型エラー
  • 新しいJIT編集エンジン
  • これらの変更のいくつかの詳細は以下のとおりです

    名前付き引数
    オプションのパラメータをスキップし、必要なパラメータだけを指定します.
    引数は独立していて、自己ドキュメント化されます.
    // PHP 7
    htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
    
    // PHP 8
    htmlspecialchars($string, double_encode: false);
    

    属性
    phpdoc注釈の代わりに、PHPのネイティブ構文で構造化されたメタデータを使用することができます.
    // PHP 7
    class PostsController
    {
        /**
         * @Route("/api/posts/{id}", methods={"GET"})
         */
        public function get($id) { /* ... */ }
    }
    
    // PHP 8
    class PostsController
    {
        #[Route("/api/posts/{id}", methods: ["GET"])]
        public function get($id) { /* ... */ }
    }
    

    プロパティプロモーション
    プロパティを定義して初期化するためのより少ないBoilerplateコード.
    //PHP 7
    class Point {
      public float $x;
      public float $y;
      public float $z;
    
      public function __construct(
        float $x = 0.0,
        float $y = 0.0,
        float $z = 0.0,
      ) {
        $this->x = $x;
        $this->y = $y;
        $this->z = $z;
      }
    }
    
    // PHP 8
    class Point {
      public function __construct(
        public float $x = 0.0,
        public float $y = 0.0,
        public float $z = 0.0,
      ) {}
    }
    

    ユニオンタイプ
    型の組み合わせのphpDoc注釈の代わりに、実行時に検証されるネイティブユニオン型宣言を使用できます.
    //PHP 7
    class Number {
      /** @var int|float */
      private $number;
    
      /**
       * @param float|int $number
       */
      public function __construct($number) {
        $this->number = $number;
      }
    }
    
    new Number('NaN'); // Ok
    
    //PHP 8
    class Number {
      public function __construct(
        private int|float $number
      ) {}
    }
    
    new Number('NaN'); // TypeError
    

    マッチ式
    新しいマッチはスイッチに似ていて、以下の特徴を持ちます.
  • マッチは、その結果を変数に格納するか、または返すことを意味する式です.
  • マッチブランチは、1行式をサポートして、ブレークを必要としません;文.
  • マッチは厳密な比較です.
  • // PHP 7
    switch (8.0) {
      case '8.0':
        $result = "Oh no!";
        break;
      case 8.0:
        $result = "This is what I expected";
        break;
    }
    echo $result;
    //> Oh no!
    
    // PHP 8
    echo match (8.0) {
      '8.0' => "Oh no!",
      8.0 => "This is what I expected",
    };
    //> This is what I expected
    

    ヌルセーフ演算子
    Nullチェック条件の代わりに、新しいNullSafe演算子で呼び出しのチェーンを使用することができます.チェーン内の1つの要素の評価が失敗すると、チェーン全体の実行が中止され、チェーン全体がnullに評価されます.
    // PHP 7
    $country =  null;
    
    if ($session !== null) {
      $user = $session->user;
    
      if ($user !== null) {
        $address = $user->getAddress();
    
        if ($address !== null) {
          $country = $address->country;
        }
      }
    }
    
    //PHP 8
    $country = $session?->user?->getAddress()?->country;
    

    文字列から数値への比較
    数値文字列と比較すると、PHP 8は数値比較を使用します.それ以外の場合は、数値を文字列に変換し、文字列比較を使用します.
    // PHP 7
    0 == 'foobar' // true
    
    // PHP 8
    0 == 'foobar' // false
    
    これらは、すべての変更について知っている変更のうちのいくつかです.