【感想】PHP8.3 の新機能についての勉強会に参加

Posted date at 2023-08-30

php

この記事の内容について

PHPerのための「PHP8.3 の新機能について語り合う」PHP TechCafe 「PHP8.3の新機能について語り合う」のテーマで勉強会に参加しました。 PHP8.3は2023/11/23にリリースされる予定です。 ShowNoteが公開されていたので気になったところを一部抜粋してアウトプットとしてここに残します。

ShowNote抜粋等

Making overridden method

オブジェクトの実装を示すアトリビュート#[\Override]が追加される

恥ずかしながらPHP8から導入されたアトリビュートについて初めて存在を知りました。 以下記事を参考に軽めにキャッチアップ アトリビュートの概念Attributesで実現するPHP8時代のバリデータPHP 8 で導入される Attributes 事始めPHP8 Attributeの活用例

PHP7まではコメントとして無視される。 メタデータをコードの宣言時に埋め込むことができ、リフレクションAPIを使って調べることが可能。⇒ コードに直接埋め込み可能な設定用の言語。

ユースケースは,,,

  • PHP Core 実装として
  • PHP extension 実装として
  • 各種ライブラリ実装として
  • 各種フレームワーク実装として

アプリケーションコード側はあまり書く機会がない。 利用するタイミングで提案されているのは、バリデーションとデータ変換

<details> 請求データをCSVファイルへ変換する使用のアトリビュート設定例
/** * 都道府県番号 * @return string */ #[Csv(index:4, isRequired:true, maxBytes:6, type:Type::CODE)] public function getPrefectureCode() :string { } /** * 事業所番号 * @return string */ #[Csv(index:5, isRequired:true, maxBytes:10, type:Type::ALPHA_NUMERIC)] public function getFacilityNumber() :string { } /** * 請求金額 * @return string */ #[Csv(index:6, isRequired:true, maxBytes:10, type:Type::NUMERIC)] public function getBilledAmount () :string { }

CSV変換時にアトリビュートの設定値を読み取り、仕様に違反していないかを担保することが出来るようになりました。

</details>

よりドキュメント化されたコードを書くことができそうです。 限定的な用途かもしれませんが。

Typed Class Constants

クラス、インターフェイス、トレイト、および enum の定数に型を設定できるようになる。

enum E { const string TEST = "Test1"; // E::TEST is a string } trait T { const string TEST = E::TEST; // T::TEST is a string too } interface I { const string TEST = E::TEST; // I::TEST is a string as well } class Foo implements I { use T; const string TEST = E::TEST; // Foo::TEST must also be a string } class Bar extends Foo { const string TEST = "Test2"; // Bar::TEST must also be a string, but the value can change }

Dynamic class constant fetch

クラス定数を動的に指定可能

class Foo { const BAR = 'bar'; } $bar = 'BAR'; // PHP8.3 以降は以下の記述が可能 echo Foo::{$bar}; // PHP8.2 までで上記と同様の動作を実現する方法 echo constant(Foo::class . '::' . $bar);

PHP RFC: Dynamic class constant fetch

Readonly amendments

readonlyプロパティをcloneするときに再初期化することが可能になる。

// __clone()の実行中のみ、readonlyプロパティを再初期化することができる class Foo { // コンストラクタ public function __construct( public readonly DateTime $bar, public readonly DateTime $baz ) {} // clone public function __clone() { $this->bar = clone $this->bar; // OK $this->cloneBaz(); } private function cloneBaz() { // __cloneから呼び出されている場合はreadonlyプロパティの変更がOK unset($this->baz); } } $foo = new Foo(new DateTime(), new DateTime()); $foo2 = clone $foo; // エラーは発生しない。 // この場合、Foo2::$bar は2重にcloneされており、Foo2::$baz は初期化されない
  • しかし、__cloneメソッドでreadonlyプロパティを変更できるのは1回のみ

PHP RFC: Readonly amendments

PDO driver specific sub-classes

各ドライバ固有のメソッドを持つPDOのサブクラスを追加
特定のサブクラスを作成できるPDO::connectを追加

Randomizer Additions

Randomizerクラスに以下の関数が追加

  1. getBytesFromString()
  2. getFload()
  3. nextFload

そもそもRandomizerクラスはランダムな値を返すクラス Random\ Randomizer クラス

【重要】Path to Saner Increment/Decrement operators

phpの算術演算子の仕様変更があります。 ++$n;のように記述したときの$nの型によって挙動がPHP8.2以前と変わるようです。

テキストによくまとまっているので確認しておくべきです。 勉強会で公開されたノートにまとまっています。 該当部分のリンク

←ホームに戻る