その他
前回に紹介しきれなかった言語仕様の変更点と、処理系の改良点を紹介します。
DelayedTargetValidationアトリビュート
PHP 8.5では、アトリビュートのコンパイル時エラーを抑制する、DelayedTargetValidationアトリビュートが利用できるようになりました。
DelayedTargetValidationアトリビュートが指定されたアトリビュートは、そのアトリビュートが何らかのエラーを起こす場合でもコンパイルエラーとなりません。これは、現在のバージョンではサポートされていないアトリビュートのターゲットが、将来的にサポートされることを前提としてエラーを回避するために用いられます。
以下のリストは、PHP 8.5ではサポートされていない、定数のオーバーライドを実行しようとしているが、DelayedTargetValidationアトリビュートによってエラーとなりません。
class MyClass {
public const NAME = 'Yamauchi';
}
class YourClass extends MyClass {
#[\DelayedTargetValidation]
#[\Override] // コンパイル時に評価されない
public const NAME = 'Onodera'; // 単なる定数宣言となる
}
$y = new YourClass();
print $y::NAME . PHP_EOL; // Onodera
致命的エラーのバックトレース
PHP 8.5では、致命的エラーがバックトレース(スタックトレース)を表示するようになりました。
これまでのPHPでは、エラーが発生してもバックトレースが表示されず、どのような関数呼び出しを経てエラーになったのかの把握が困難でした。バックトレースが表示されることで、このような問題を解消できます。
function a() {
b();
}
a();
// Fatal error: Uncaught Error: Call to undefined function b() in /…/error_backtrace.php:4
// Stack trace:
// #0 /…/error_backtrace.php(7): a()
// #1 {main}
// thrown in /…/error_backtrace.php on line 4
このように、バックトレースが表示されて関数aからの呼び出しであることが分かります。なお、この機能は既定で有効になっているので、従来に戻したい場合にはphp.iniファイルにfatal_error_backtraces = Offを記述します。
Directoryクラスのリソースオブジェクト化
PHP 8.5では、Directoryクラスを完全不透明クラスとして取り扱うようになりました。完全不透明クラスとは、クラスではあるが、newやcloneをはじめとする通常のクラスでは普通の操作が一切できないクラスです。Directoryクラスのオブジェクトはdir関数で生成するのが一般的なので、それ以外の生成方法を一切禁止することになります。
これによって、従来は記述できていたnewによるインスタンス生成ができなくなり、生成できても実際には使えないといったトラブルを回避できるようになりました。
OPcacheの非オプション化
PHP 8.5では、OPcacheを常にロードすることで高速化が可能になりました。OPcacheとはOpecode Cacheの意味で、PHPのソースコードを変換した後のオペコードを保存しておき、次のリクエストが来たときにそれを使う仕組みです。ソースコード変換の過程を省略できるので、同じコードの実行なら大幅な速度向上を見込めます。
OPcacheは長い間オプションであり、これを最初から使わないことも可能でしたが、PHP 8.5では常にロードされる状態となりました。従来は可能であった使わないという選択(conrigure時に--disable-opcacheを指定する)はできなくなり、php.iniファイルからzend_extension=opcacheを削除する必要があります。
まとめ
今回は、PHP 8.5における関数と処理系の強化ポイントを紹介しました。
PHPでは、このように非常に細かな改変が各バージョンで施されています。よりモダンで使い勝手のよい言語として成長し続けるPHPを、今後も見守っていきたいものです。
