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に用意されている「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
圧倒的に分かりやすい記述に変わっていますね。
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;
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
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の公式ページを確認しましょう。
今回ご紹介している情報はあくまで一部で、全ての情報が公開されているのは公式ページです。
YouTube
公式ページの表現は正直分かりにくいことも多いですよね。
最近ではYouTubeの動画で概要を確認するのも有効な方法です。
5分程度の動画で概要を確認するなら下記がおすすめ
詳細なPHP8.0の情報が知りたいなら下記がおすすめ
プログラミングスクールは?
プログラミングスクールでもPHP8.0の情報を学べるのか疑問に思う方もいるかと思います。
結論としてはスクールによるため、無料カウンセリングで各自確認するようにしてください。
ただ、おそらくですが、PHP8.0に対応するのはリリース後、数ヶ月は掛かると考えておいた方が良いでしょう。
さいごに: PHP8.0は処理速度改善とコードの可読性向上に期待
本記事では、PHP8.0が正式リリースされた情報と新機能の概要についてご紹介してきました。
本文中でもご紹介した通り、「JITコンパイラ」による速度改善と言語機能追加による「コードの可読性向上」が期待出来ます。
すぐに対応するプロジェクトは少ないと思いますが、メジャーアップデートということで、いつか切り替える必要が出てくるため、事前学習を怠らず、いつでも対応できるようにスキルを身につけておきましょう。