使う場面はなかなかないだろうけれど、やっつけしてみた
<?php
class Hoge
{
public function __call($name, $arguments)
{
$funcRef = new ReflectionMethod($this, $name);
$parameters = $funcRef->getParameters();
$createNewArguments = false;
if (count($arguments) == 1) {
if (count($parameters) == 1 && isset($arguments[0][$parameters[0]->name])) {
$createNewArguments = true;
} elseif (count($parameters) != 1) {
$createNewArguments = true;
}
}
if ($createNewArguments) {
$arguments = $arguments[0];
foreach ($parameters as $param) {
if (isset($arguments[$param->name])) {
$newArgs[] = $arguments[$param->name];
} else {
var_dump($param->isDefaultValueAvailable());
if ($param->isDefaultValueAvailable()) {
$newArgs[] = $param->getDefaultValue();
} else {
throw new Exception('引数$'.$param->name.'が定義されていません');
}
}
}
call_user_func_array([$this, $name], $newArgs);
} else {
call_user_func_array([$this, $name], $arguments);
}
}
protected function test($a, $b = 'test', $c)
{
var_dump([
'a' => $a,
'b' => $b,
'c' => $c,
]);
}
}
$class = new Hoge();
$class->test([
// 'b' => 'bbb',
'a' => 'aaa',
'c' => 'ccc',
]);
$class->test('123', '234', '345');