別件で調査をしていて、ふと「あれ? call_user_func_array() にhash配列渡したら、名前付き引数的にいい感じに処理してくれるんぢゃね?」って思ったので、早速実験。
名前付き引数(PHP8.0から)
https://www.php.net/manual/ja/functions.arguments.php#functions.named-arguments
まず前提になる「今までの」コード。
<?php declare(strict_types=1); error_reporting(-1); // function test($a, $b, $c) { var_dump($a, $b, $c); } // call_user_func_array('test', ['aaa', 'bbb', 'ccc']);
string(3) "aaa"
string(3) "bbb"
string(3) "ccc"
うん。
では、まず「すなおな」hash配列。
call_user_func_array('test', ['a' => 'aaa', 'b' => 'bbb', 'c' => 'ccc']);
string(3) "aaa"
string(3) "bbb"
string(3) "ccc"
まぁここまでは。
ちなみにPHP7.4系で動かしても結果は同じでした。
次に「順番を入れ替え」。
call_user_func_array('test', ['b' => 'bbb', 'c' => 'ccc', 'a' => 'aaa']);
string(3) "aaa"
string(3) "bbb"
string(3) "ccc"
あぁ、予想通り。
ちなみにPHP7.4系だと以下の通り。
string(3) "bbb"
string(3) "ccc"
string(3) "aaa"
ではここから少し意地悪系。
まずは「追加でNGがある」ケース。
call_user_func_array('test', ['b' => 'bbb', 'c' => 'ccc', 'a' => 'aaa', 'd' => 'ddd']);
Fatal error: Uncaught Error: Unknown named parameter $d in ...
うんまぁそうだろうなぁ的な。
ちなPHP7.4系だと「エラーは出ないで動く」。まぁパラメタが多い時に「(自作関数だと)何も言ってくれない」からなぁ……。
したら一応、足りない系も。
call_user_func_array('test', ['b' => 'bbb', 'c' => 'ccc']);
Fatal error: Uncaught ArgumentCountError: test(): Argument #1 ($a) not passed in ...
で~す~よ~ね~。
予想通りの動きでなにより。
うっすらと懸念がないわけではない、にしても、基本的には「hashのほうがわかりやすい」ケースが増えてくるんじゃないかしらん???
興味深かったので、メモかねて。
追伸
なお、元々調査していて期待していた「phpunitのdataProvider」では使えませんでした orz
array_values() とかやってる感じなんかなぁ?(なんかそんな雰囲気の挙動)