がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

名前付き引数とcall_user_func_array

別件で調査をしていて、ふと「あれ? 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() とかやってる感じなんかなぁ?(なんかそんな雰囲気の挙動)