PHP 8の名前付き引数
既存の関数も名前付き引数を付けて呼べるようにする提案
Pythonと似たような感じ
ただし、*,を前置して名前付きの呼び出しを強制する機能はない
宣言側のopt-inは不要
後方非互換
call_user_func_arrayや引数に(連想)配列を展開して呼び出すパターンで、現状はキーが暗黙的に無視されているのが、このRFCの実装後はキーも解釈されてTypeErrorや違う動作になる可能性がある
クラスの親子間やインターフェースと実装クラス間において、メソッドの引数名が食い違うのがLSP違反になる
RFCでは必ずしもエラーならない仕様
本文に例あり
既存コードをケア?
引数名の変更によってAPIの後方互換性が損なわれるようになる
対案の検討
名前付き引数を宣言側のopt-inとすること
利点
後方互換性の問題が回避される
欠点
既存の関数が名前付き引数で呼べなくなる
RFCの作者はこの点が大きな損失であると記している
既存の複雑なAPIのユーザーにとってこのRFCが助けになると作者は考えているようだ
引数で配列のdestructuringをできるようにする
今のPHPはまだ配列が型安全じゃないし、既存のpositionalな引数のような水準の安全性を確保するまでには道のりが通そうlefb766.icon
internalsメーリスの議論
/r/PHP
名前付き引数によって、引数リストに新しく追加して関数を拡張することがとても簡単にできるようになってしまうという指摘
既存の悪い設計のAPIを呼び出しやすくなることと組み合わせると、「悪い設計のAPIに赦しを与えている」ということもできそうlefb766.icon
所感lefb766.icon
opt-inは必要だと思う
十分強力
PHP 8からはTypeScriptみたくコンストラクタパラメータをメンバー変数に昇格する機能も入るし
これだけでRFCの課題がほとんど解決する
名前付きの呼び出しを強制する手段も必要
今のRFCだと、途中の引数をoptionalに変更するには順序を最後に移動させなければいけない
呼び出し側が名前付きじゃないと壊れる(後方非互換)
宣言側で強制できれば、この変更を後方互換な形でできる
エイリアスは個人的にはまだ無くていい