php
PHPerのための「PHP8.3 の新機能について語り合う」PHP TechCafe 「PHP8.3の新機能について語り合う」のテーマで勉強会に参加しました。 PHP8.3は2023/11/23にリリースされる予定です。 ShowNoteが公開されていたので気になったところを一部抜粋してアウトプットとしてここに残します。
オブジェクトの実装を示すアトリビュート#[\Override]が追加される
恥ずかしながらPHP8から導入されたアトリビュートについて初めて存在を知りました。 以下記事を参考に軽めにキャッチアップ アトリビュートの概念Attributesで実現するPHP8時代のバリデータPHP 8 で導入される Attributes 事始めPHP8 Attributeの活用例
PHP7まではコメントとして無視される。 メタデータをコードの宣言時に埋め込むことができ、リフレクションAPIを使って調べることが可能。⇒ コードに直接埋め込み可能な設定用の言語。
ユースケースは,,,
アプリケーションコード側はあまり書く機会がない。 利用するタイミングで提案されているのは、バリデーションとデータ変換
<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 { }
</details>CSV変換時にアトリビュートの設定値を読み取り、仕様に違反していないかを担保することが出来るようになりました。
よりドキュメント化されたコードを書くことができそうです。 限定的な用途かもしれませんが。
クラス、インターフェイス、トレイト、および 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 }
クラス定数を動的に指定可能
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プロパティを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 は初期化されない
各ドライバ固有のメソッドを持つPDOのサブクラスを追加
特定のサブクラスを作成できるPDO::connectを追加
Randomizer
クラスに以下の関数が追加
そもそもRandomizerクラスはランダムな値を返すクラス Random\ Randomizer クラス
phpの算術演算子の仕様変更があります。
++$n;
のように記述したときの$nの型によって挙動がPHP8.2以前と変わるようです。
テキストによくまとまっているので確認しておくべきです。 勉強会で公開されたノートにまとまっています。 該当部分のリンク