メモ

PHP 8のアップデートで加わる新機能一覧


プログラミング言語の一つであるPHPは、ウェブ開発でよく使用される言語であり、HTMLに埋め込むことができるのが特徴です。PHPは記事作成時点で7.4が最新バージョンですが、2020年末にPHP 8の公開が予定されており、PHP 8で実装される予定の機能をBrentさんが解説しています。

New in PHP 8 - stitcher.io
https://stitcher.io/blog/new-in-php-8

GitHub - php/php-src: The PHP Interpreter
https://github.com/php/php-src

◆ユニオン型
ユニオン型とは、通常は1つしか指定できない「int」や「string」といった変数の型を複数指定できる機能であり、これまでもTypeScriptで実装されていました。PHPは言語が変数の型を自動で決めてくれる動的型付けを採用する言語なので、このユニオン型と相性がいいとのこと。ユニオン型を使用する際は下記のようにコードを記述します。

public function foo(Foo|Bar $input): int|float;


注意点として、返り値がないことを表すvoid型はユニオン型に含めることはできません。

◆JIT
JITは「Just in time」の頭文字であり、PHPのパフォーマンスを向上させるために導入されます。PHPはプログラムを実行するたびに機械がコードを読み取って実行できるコードに変換し、実行が終了したら変換したコードを破棄するインタプリタ型のプログラミング言語であり、CやJavaといったあらかじめコードを機械が読み取りやすい水準のコードに変換しておくコンパイラ型の言語と比較すると、実行速度の面で不利でした。JITは変換したコードを保存しておき、同様の命令があった際に変換したコードを使い回すことで、逐一コードを変換する手間を省き速度を上げることを可能にした技術です。

JIT未実装のPHP 7とJITが実装されたPHPをブラウザで実行し速度を比較した動画が以下。右側のJITが実装されたPHPのほうがムービーが滑らかに動いています。

PHP 7.0 vs JIT PoC - YouTube


◆返り値型にstatic型を指定可能に
これまで、self型は返り値の宣言に使用可能でしたが、PHP 8ではstatic型も使用可能になります。

class Foo
{
    public function test(): static
    {
        return new static();
    }
}


◆WeakMap
PHP 7.4で弱参照と呼ばれる機能が実装されました。通常、メモリ領域を自動で解放するガベージコレクタは、オブジェクトが参照されている場合はそのオブジェクトを解放することができませんが、弱参照によって参照されたオブジェクトは、ガベージコレクタによる解放の対象となります。PHP 8で実装予定のWeakMapをオブジェクトに対し宣言しておけば、そのオブジェクトが参照されていてもガベージコレクタによる解放の対象とすることができます。

class Foo 
{
    private WeakMap $cache;
 
    public function getSomethingWithCaching(object $obj): object
    {
        return $this->cache[$obj]
           ??= $this->computeSomethingExpensive($obj);
    }
}


◆::class
オブジェクトのクラス名を取得するのに、PHP 8からはget_class()だけでなく::classが使用できるようになります。

$foo = new Foo();

var_dump($foo::class);


◆DateTimeとDatetimeImmutableの変換
PHPにはオブジェクト作成後も状態を変更できるミュータブルなDateTimeクラスと状態を変更できないイミュータブルなDatetimeImmutableクラスがあり、PHP 8からは下記のように簡単に変換が可能になります。

#DatetimeImmutableからDateTimeへ
DateTime::createFromInterface(DateTimeInterface $other);

#DateTimeからDatetimeImmutableへ
DateTimeImmutable::createFromInterface(DateTimeInterface $other);


◆fdiv関数
整数の割り算を行う関数であるfdiv関数が新たに実装され、0で除算しようとした場合はINF、-INF、NANが状況に応じて返されます。

◆TypeErrorの一貫性を確保(下位互換性なし)
渡された型が期待された型と一致しない場合、ユーザーが定義した関数ではTypeErrorが返されていましたが、内部関数はnullが返されていました。PHP 8ではどちらもTypeErrorに統一されます。

◆警告、通知、エラーの整理(下位互換性なし)
これまで警告や通知として扱われていたエラーを独立したエラーとして表示したり、通知を警告にしたりするといった整理を行います。

PHP: rfc:engine_warnings
https://wiki.php.net/rfc/engine_warnings

◆デフォルトのエラーレベルの変更(下位互換性なし)
PHP 7までE_NOTICEやE_DEPRECATEDとして扱われていたエラーがE_ALLに集約されます。これにより、これまで無視されていたエラーがPHP 8へのアップデートによって表出する可能性があります。

◆エラー制御演算子の動作変更(下位互換性なし)
これまでエラー制御演算子である@を記述するとエラーを無視して処理を進めることができましたが、PHP 8からは@を記述しても致命的なエラーは表示されるようになります。

◆オペランドを連結する際の優先順位(下位互換性なし)
PHP 8では、オペランドを連結する優先順位が変更されています。下記のコードを例にあげます。

echo "sum: " . $a + $b;


PHP 7までは下記のように解釈されていましたが……

echo ("sum: " . $a) + $b;


PHP 8からは下記のように解釈されます。

echo "sum: " . ($a + $b);


なお、PHP 8は現在も開発中であり、予定されている新機能は変更される可能性があります。

この記事のタイトルとURLをコピーする

・関連記事
O(オー)と0(ゼロ)など紛らわしい文字が見分けやすくなるプログラミング用の無料フォントをまとめた「Programming Fonts」 - GIGAZINE

漢文風プログラミング言語「文言」を読み解いてみた - GIGAZINE

最初に「プログラミング言語」という言葉が使われ始めたのは一体いつなのか? - GIGAZINE

無料のRPGをプレイするだけで未経験者でもプログラミングを習得可能な「コードクロニクル」でPythonをマスターしてみた - GIGAZINE

Linuxのファイルシステム「Btrfs」を5年間使用した記録 - GIGAZINE

in メモ,   ソフトウェア, Posted by log1n_yi

You can read the machine translated English article here.