🐈

PHP 8.2のリリース情報で気になった項目をまとめてみた

2022/08/03に公開
2

普段業務で使用しているPHPのv8.2のリリース情報が公開されていたので、追加、変更内容について、気になったものをまとめてみました。
2022年7月19日にfeature freezeとなったことで現在はリリースへ向けたテスト段階へ入っているみたいです。
※feature freeze : 機能(Feature)の実装が凍結(Freeze)されるタイミングのことを指します。これ以上はリリースまで新機能の開発はせず、テストしていきます的な状態です。(間違っていたら、ごめんなさい。)
https://wiki.php.net/todo/php82

readonly Classes

readonly class MyObject {
    public string $myValue;
}
abstract readonly class Foo {}
final readonly class Bar {}

readpnlyクラスが宣言されると以下の特徴を持つみたいです。

  • 定義するプロパティは型指定が必須
  • 動的プロパティは使用不可、#[AllowDynamicProperties] 属性の付与も不可
  • プロパティの書き換えは不可

true type

public function foo(true $value): true {
	return true;
}

false型はphp8.0の時にunion型と同時に実装されていましたが、新しくtrue型も実装されるみたいです。
関数によってはtrueしか返さないものもあるため、そういった場面で活躍しそうです。

New memory_reset_peak_usage function

php8.2以前

$string = str_repeat('a', 1024 * 1024 * 4);
memory_get_peak_usage(); // 4590752

unset($string);

$string = str_repeat('a', 1024 * 1024 * 3);
memory_get_peak_usage(); // 4590752

php8.2

 $string = str_repeat('a', 1024 * 1024 * 4);
 memory_get_peak_usage(); // 4590752

 unset($string);
 memory_reset_peak_usage();

 $string = str_repeat('a', 1024 * 1024 * 3);
 memory_get_peak_usage(); // 3542648

memory_get_peak_usageでは実行全体のピークメモリ量を返しますが、memory_reset_peak_usageを使うことで各アクションごとでのピークメモリを記録することが可能になりました。

AllowDynamicProperties Attribute

 #[AllowDynamicProperties]
 class User() {
     private int $uid;
 }

 $user = new User();
 $user->foo = 'x';
 $user->foo = 'y'; // エラーにならない

php8.2から動的プロパティが非推奨になりました。
Dynamic properties are deprecated
ですが、完全に使えなくなるというわけではなく、クラスにAllowDynamicProperties属性を定義することで使用可能になるみたいです。
reoadonlyクラスには定義できません。

最後に

動的プロパティは過去の開発で使ってしまっていたので、副作用が...😅。
Laravelで使われているライブラリでも何度か動的プロパティが使われているのを見たことがあるので、大丈夫なのでしょうか。

参考記事

PHP公式マニュアル
php.watch

Discussion

Tomoaki NagaharaTomoaki Nagahara

貴重な記事ありがとうございます!

動的プロパティが非推奨というのは吃驚ですね…。
これは外部からの変更だけが非推奨なのか、内部からの変更も非推奨になるのか気になります。

ところで、codeブロックに言語指定を入れると、シンタックス・ハイライトが適用されるので、読みやすくなると思いました!

やんやん

ありがとございます!
早速編集させていただきました。

動的プロパティは便利だったので、結構使っていました...
アプリケーションでPHPのバージョンアップがあるので、修正項目が多く大変です笑

アップデートの際はこれまでの記述が非推奨になったりするので、常にアンテナは張っておかないとですね。