3 回答
![?](http://img1.sycdn.imooc.com/533e52b90001456f02000200-100-100.jpg)
TA贡献1806条经验 获得超8个赞
可选参数仅在函数调用结束时起作用。如果不指定$ x,则无法在函数中指定$ y的值。某些语言通过命名参数(例如VB / C#)支持此功能,但PHP不支持。
如果对参数而不是对参数使用关联数组,则可以模拟这一点,即
function foo(array $args = array()) {
$x = !isset($args['x']) ? 'default x value' : $args['x'];
$y = !isset($args['y']) ? 'default y value' : $args['y'];
...
}
然后像这样调用该函数:
foo(array('y' => 'my value'));
![?](http://img1.sycdn.imooc.com/54584dad0001dd7802200220-100-100.jpg)
TA贡献1806条经验 获得超5个赞
实际上有可能:
foo( 'blah', (new ReflectionFunction('foo'))->getParameters()[1]->getDefaultValue(), 'test');
是否要这样做是另一个故事:)
更新:
避免此解决方案的原因有:
(可以说)丑陋
它有明显的开销。
作为其他答案的证明,还有其他选择
但是在以下情况下它实际上可能是有用的:
您不想/无法更改原始功能。
您可以更改功能,但:
使用null(或等效)不是一种选择(请参见DiegoDD的注释)
您既不想与他人合作,也不想与 func_num_args()
您的生活取决于保存几个LOC
关于性能,一个非常简单的测试表明,使用Reflection API获取默认参数会使函数调用慢25倍,而调用时间仍不到一微秒。您应该知道是否可以忍受。
当然,如果要在循环中使用它,则应事先获取默认值。
- 3 回答
- 0 关注
- 461 浏览
添加回答
举报