- var_dump: documentation ( source)
- get_defined_vars: documentation ( source)
<?php
class CallableByName
{
private $closure;
public function __construct(\Closure $closure)
{
$this->closure = $closure;
}
public function invoke(array $parameters)
{
return call_user_func_array($this->closure, $this->getOrderedFromNamed($parameters));
}
public function getOrderedFromNamed(array $parameters)
{
$orderedParameters = [];
$functionReflection = new \ReflectionFunction($this->closure);
foreach ($functionReflection->getParameters() as $parameterReflection)
{
/* @var $parameterReflection \ReflectionParameter */
$parameterName = $parameterReflection->getName();
if (isset($parameters[$parameterName]))
{
$orderedParameters[$parameterName] = $parameters[$parameterName];
continue;
}
if ($parameterReflection->isDefaultValueAvailable())
{
$orderedParameters[$parameterName] = $parameterReflection->getDefaultValue();
continue;
}
$orderedParameters[$parameterName] = null;
}
return $orderedParameters;
}
}
$callableByName = new CallableByName(function($foo, $bar, $qux = 'Holy Qux!', $zip = null)
{
var_dump(get_defined_vars());
});
$callableByName->invoke([
'bar' => 'Hello',
'foo' => 'World',
]);
$callableByName->invoke([
'bar' => 'Hello',
'zip' => 'World',
]);