我希望这个解决方案在我 2.5 年前开始使用 PHP 时就已经存在了。它在我创建的示例中效果很好,我不明白为什么它不应该是完全可扩展的。与之前的提议相比,它提供了以下好处:
(i) 函数内对参数的所有访问都是通过命名变量进行的,就好像参数已完全声明一样,而不需要数组访问
(ii) 调整现有功能非常快捷方便
(iii) 任何函数都只需要一行额外的代码(除了不可避免地需要定义默认参数,无论如何您都将在函数签名中执行此操作,而是将它们定义在数组中)。额外线路的功劳完全归功于 Bill Karwin。这一行对于每个函数都是相同的。
方法
使用强制参数和可选数组定义您的函数
将可选参数声明为局部变量
关键:使用您通过数组传递的参数替换任何可选参数的预先声明的默认值。
extract(array_merge($arrDefaults, array_intersect_key($arrOptionalParams, $arrDefaults)));
调用函数,传递它的强制参数,并且只传递你需要的那些可选参数
例如,
function test_params($a, $b, $arrOptionalParams = array()) {
$arrDefaults = array('c' => 'sat',
'd' => 'mat');
extract(array_merge($arrDefaults, array_intersect_key($arrOptionalParams, $arrDefaults)));
echo "$a $b $c on the $d";
}
然后这样称呼它
test_params('The', 'dog', array('c' => 'stood', 'd' => 'donkey'));
test_params('The', 'cat', array('d' => 'donkey'));
test_params('A', 'dog', array('c' => 'stood'));
结果:
狗站在驴子上
猫坐在驴子上
一只狗站在垫子上