✨
PHP8の名前付き引数はcall_user_func_arrayでも使える
3行で
@tanakahisateruさんのツイートを見てやってみた。
引数のコンテナが内部的には配列と同じHashTable
構造体を使っていて、よしなにしてくれている。
RFCにも仕様として明記されている。
実例
<?php
function proc($foo, $bar = 0, $baz = false) {
$args = func_get_args();
var_dump([compact('foo', 'bar', 'baz'), $args]);
}
proc('foo1', baz: true);
call_user_func('proc', 'foo2', baz: true);
call_user_func_array('proc', ['foo3', true]);
call_user_func_array('proc', ['foo4', 'baz' => true]);
結果
array(2) {
[0]=>
array(3) {
["foo"]=>
string(4) "foo1"
["bar"]=>
int(0)
["baz"]=>
bool(true)
}
[1]=>
array(3) {
[0]=>
string(4) "foo1"
[1]=>
int(0)
[2]=>
bool(true)
}
}
array(2) {
[0]=>
array(3) {
["foo"]=>
string(4) "foo2"
["bar"]=>
int(0)
["baz"]=>
bool(true)
}
[1]=>
array(3) {
[0]=>
string(4) "foo2"
[1]=>
int(0)
[2]=>
bool(true)
}
}
array(2) {
[0]=>
array(3) {
["foo"]=>
string(4) "foo3"
["bar"]=>
bool(true)
["baz"]=>
bool(false)
}
[1]=>
array(2) {
[0]=>
string(4) "foo3"
[1]=>
bool(true)
}
}
array(2) {
[0]=>
array(3) {
["foo"]=>
string(4) "foo4"
["bar"]=>
int(0)
["baz"]=>
bool(true)
}
[1]=>
array(3) {
[0]=>
string(4) "foo4"
[1]=>
int(0)
[2]=>
bool(true)
}
}
Discussion