background image

如何使用命名参数调用

 PHP 函数

代码如下:
<?php
$x = function($bar, $foo="9") {
  echo $foo, $bar, "\n";
};
class MissingArgumentException extends Exception {
}
function call_user_func_named_array($method, $arr){
  $ref = new ReflectionFunction($method);
  $params = [];
  foreach( $ref->getParameters() as $p ){
 

 

 

 if 

(!$p->isOptional() 

and 

!isset($arr[$p->name])) 

throw 

new 

MissingArgumentException("Missing parameter $p->name");
    if (!isset($arr[$p->name])) $params[] = $p->getDefaultValue();
    else $params[] = $arr[$p->name];
  }
  return $ref->invokeArgs( $params );
}
function make_named_array_function($func) {
  return function($arr) use ($func) {
    return call_user_func_named_array($func,$arr);
  };
}
call_user_func_named_array($x, ['foo' => 'hello ', 'bar' => 'world']); //Pass all parameterss
call_user_func_named_array($x, ['bar' => 'world']); //Only pass one parameter
call_user_func_named_array($x, []); //Will throw exception
$y = make_named_array_function($x);
$y(['foo' => 'hello ', 'bar' => 'world']); //Pass all parameterss
$y(['bar' => 'world']); //Only pass one parameter
$y([]); //Will throw exception