【JITって何?】PHP8.0が遂に正式リリース!気になる新機能とは?

1036295

PHPのメジャーアップデートで8.0がリリースされるらしいけど、何が変わるんだろ?

こんにちはJun(@JunNomad)です。

プログラミング言語の「PHP」がおよそ5年ぶりとなるメジャーアップデートにより、「PHP8.0」を正式にリリースしました。

本記事ではPHP8.0に関する概要と気になる新機能についてご紹介していきます。

PHP8.0のリリース概要


PHP8.0が2020年11月26日に遂に正式リリースされました。

2015年12月3日にリリースされたPHP7.0からはおよそ5年ぶりとなるメジャーアップデートです。
※マイナーアップデート(7.xのx部分)に関しては5年の間に4回のアップデートが実施されています。

最重要アップデート項目

PHP8.0で最も注目を集めている機能が「JITコンパイラー」の機能追加です。

JITは「ジャスト・イン・タイム」の略語で、日本語では「実行時コンパイラー」と呼ばれているようです。

実行時コンパイラーを利用することにより、ソフトウェア実行時にコードのコンパイルが行われるため、処理速度の向上が期待出来ます。

従来PHPといえば、インタプリタ言語(ソフトウェア実行時に逐次機械語に変換)の代表格でもあったため、大幅な変更点と言えます。

PHP8.0の新機能


ここからはPHP8.0の新機能について、各機能の概要をご紹介していきます。

JITコンパイラー

上述した「実行時コンパイラー」です。

PHPコードが記述されたテキストファイルを読み込み、ソースコードをコンピューターが理解出来るネイティブコードにコンパイル出来るようになりました。

また同じソースコードが再実行された際には、コンパイル済みのネイティブコードが実行されるように修正されており、処理速度の大幅な改善が期待出来ます。

長時間利用されるようなアプリでは、JITコンパイラの導入により、1.5~2倍もの処理速度向上が期待出来るそうです。

Names Arguments

引数に名前を付けることが可能になり、必須でない引数項目を省略することが可能となります。

PHP7

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

PHP8

htmlspecialchars($string, double_encode: false);

PHP公式ページより引用

これだけだと分かりにくいので補足していきます。

PHPに用意されている「hetmlspecialchars」関数の正式な構文説明は下記です。

htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = TRUE ]]] ) : string

[]に記述された部分はオプションとなるため、「$flags」「$encoding」「$double_encode」に関しては引数として設定しなくても良い仕様となっています。

ただし、従来のPHP7までの記述法だと、引数の4つ目である「$double_encode」だけを自分で指定したい場合でも、設定した値がどのオプション項目となるのか判断出来ないため、デフォルト値が設定されている引数項目についても記述する必要がありました。
※今回のケースでは「$flags」と「$encoding」が該当します。

PHP8では、引数の名前を指定することにより、どの項目に割り当てたい値かをPHPが判断出来るようになったため、デフォルト値から変更しない引数の値を指定する必要がなくなり、コードが読みやすくなったと言えます。

Union types

Union typesの機能としては、複数の型定義が可能になりました。

PHP7.xでも、PHPDocによる注釈機能を活用することで、実現可能ではありましたが、今回ネイティブサポートされた形となります。

PHP公式ページでは、下記のようなサンプルコードが掲載されています。

PHP7


class Number {
  /** @var int|float */
  private $number;

  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this->number = $number;
  }
}

new Number('NaN'); // Ok

PHP8


class Number {
  public function __construct(
    private int|float $number
  ) {}
}

new Number('NaN'); // TypeError

PHP公式ページより引用

圧倒的に分かりやすい記述に変わっていますね。

Nullsafe operator

データのNullチェックを「?->」演算子で行える機能です。

さらに連結させることも可能で、従来ネスト形式で階層が深くなっていた複数データのNullチェックを、1行で簡潔に記述出来るようになりました。

PHP7


$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();
 
    if ($address !== null) {
      $country = $address->country;
    }
  }
}

PHP8


$country = $session?->user?->getAddress()?->country;

PHP公式ページより引用

Match expression

Switchステートメントの記述を簡潔にする新しい機能です。

公式の説明では、Switchステートメントに近い機能と表現されているので、厳密には全く新しい機能との認識の方が良いのかも知れません。

PHP7


switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result;
//> Oh no!

PHP8


echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

PHP公式ページより引用

Constructor property promotion

コンストラクタの記述方法が簡潔化される機能も追加されました。

PHP7


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;
  }
}

PHP8


class Point {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

従来の値を設定する作業が全て簡略化されていますね。

PHP8.0を学ぶ


PHP8.0の内容を学ぶ際に活用したいサイトをいくつかご紹介しておきます。

公式ページ

まずはPHPの公式ページを確認しましょう。

今回ご紹介している情報はあくまで一部で、全ての情報が公開されているのは公式ページです。

PHP8.0リリースノートはこちらから >>

YouTube

公式ページの表現は正直分かりにくいことも多いですよね。

最近ではYouTubeの動画で概要を確認するのも有効な方法です。

5分程度の動画で概要を確認するなら下記がおすすめ

詳細なPHP8.0の情報が知りたいなら下記がおすすめ

プログラミングスクールは?

プログラミングスクールでもPHP8.0の情報を学べるのか疑問に思う方もいるかと思います。

結論としてはスクールによるため、無料カウンセリングで各自確認するようにしてください。

ただ、おそらくですが、PHP8.0に対応するのはリリース後、数ヶ月は掛かると考えておいた方が良いでしょう。

PHPが学べるプログラミングスクール

さいごに: PHP8.0は処理速度改善とコードの可読性向上に期待


本記事では、PHP8.0が正式リリースされた情報と新機能の概要についてご紹介してきました。

本文中でもご紹介した通り、「JITコンパイラ」による速度改善と言語機能追加による「コードの可読性向上」が期待出来ます。

すぐに対応するプロジェクトは少ないと思いますが、メジャーアップデートということで、いつか切り替える必要が出てくるため、事前学習を怠らず、いつでも対応できるようにスキルを身につけておきましょう。

タイトルとURLをコピーしました