PHP8の名前付き引数はcall_user_func_arrayでも使える

2020/09/17に公開

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