php 7.4 に Typed Properties 2.0 が来そうな話
TL;DR
- https://wiki.php.net/rfc/typed_properties_v2
- php 7.4 へのオブジェクトプロパティへの型付け導入への RFC 投票が始まった
- 現在のところ反対意見もなくこのまま可決されそう
- 現状の実装だとパフォーマンスは MediaWiki でのテストで 2% 〜 3% 低下
php での静的型付け
php はほとんどの人が名前を聞いたことがあるであろう(良くも悪くも) Web を代表するインタプリタ言語の一つです。
php も時代と共に進化を続け、5.0 で OOP の導入、7.0 でタイプヒンティングの型宣言への進化や変数内部実装の大幅な刷新などモダン化が進んで来ました。
7.1 での nullable の導入など、ゆるふわダックタイピングな言語からそれなりにしっかりしたコードの書ける言語へと変化を進めていますが、ことオブジェクトのプロパティ(メンバ)に対しては今もゆるふわなままとなっていました。
Typed Properties 2.0
Typed Properties 2.0 は php 7.4 に対しオブジェクトメンバの静的型付けを導入するという提案 (RFC : Request for Comments)です。
内容としては以下のような構文が利用できるようになります。(サフィックスによる型宣言についても RFC 中では言及されていますが、全体としてプレフィックスでの実装が好ましい旨まとめられているので端折ります)
<?php declare(strict_types=1); class Example { // スカラ型型宣言 protected int $foo; // スカラ型宣言( nullable ) protected ?string $bar; // 仮想型宣言 protected iterable $baz; // オブジェクト(クラス / インターフェイス)宣言 protected HogeInterface $hoge; // callable は実装上の問題のためサポートされない (RFC 参照) /* protected callable $fuga; */ }
これは php 7.0 で導入された型宣言 (RFC: Return Type Declarations, Scalar Type Declarations) を補強するものであり、ユーザー定義オブジェクトのメンバに対する型宣言を言語レベルでサポートするものです。
Reflection でのオブジェクトメンバ型情報の扱いについても言及されており、 DI Container を用いた Auto Wiring が捗るものとなっています。
/ 余談ですが、いつになったら php.net の Reflection に関するドキュメントは整備されるんだろう... /
既に実装も行われており、 GitHub に pull-request が提出されています。
パフォーマンスへの影響
現在のところ、提案されている実装を適用した際に、 MediaWiki を用いたパフォーマンス計測で 2% 〜 3% ほどの速度低下が見られるようです。
とは言えそこまで大きな影響でもなく、 Zend OPCache の高性能化もあってphp 7.4 がリリースされる頃には殆ど影響はなくなっているのではないかと思います。
RFC 投票の状況
php では新機能の実装や言語コアへの変更を加える際には投票を行い、それぞれ一定以上のコアメンバーの承認が必要となります。
今回の Typed Properties 2.0 に関しては php の言語コアに対する変更になるため、投票者の3分の2が賛成しなければ可決されません。
2018/09/17 時点での投票状況は賛成60人反対1人と前例のないものとなっており、ほぼほぼ可決されるものと思います。
(今のところ反対となっている pollita 氏はジョークで反対に投票していることを Twitter 上で明らかにしています)
モダンな php に向けて
何かとクソ言語として *1 有名な php ですが、 7.0 以降ドラスティックに言語のモダン化が進められています。
今回の Typed Properties 2.0 以外にも非同期処理への対応である Fiber の導入(Ruby そのまんまですねこれ)提案や internals での php 8.0 に向けての議論が進められており、見ていて楽しい感じです。
*1 Wordpress のメンテさせられそうになった時ははよ滅べクソ言語と思いましたが