[英]Testing optional arguments in PHP
我在类之间有一些“setter”方法,为方便起见,我添加了一个可选参数$previous
,它通过引用获取参数,并在用新值替换之前用现有值填充它。 例如:
public function set_value($key, $value, &$previous = null)
{
$previous = $this->get_value($key);
$this->_values[$key] = $value;
return $this;
}
这很好用; 但是在某些情况下,相应的“getter”方法有点过程密集,无条件运行它是一种浪费。 我想我可以测试:
if(null !== $previous)
{
$previous = $this->get_value($key);
}
这不起作用,因为通常作为$previous
的参数传递的变量$previous
未在其范围中定义,并且无论如何都默认为null。 我遇到的唯一解决方案是:
public function set_value($key, $value, &$previous = null)
{
$args = func_get_args();
if(isset($args[2])
{
$previous = $this->get_value($key);
}
$this->_values[$key] = $value;
return $this;
}
或者,一行:
if(array_key_exists(2, func_get_args()))
{
// ...
}
我不喜欢方法体依赖于参数索引( 当它看起来应该是不必要的时候 )有没有更清晰的方法来实现我在这里之后的东西?
我试过了:
if(isset($previous)){}
if(!empty($previous)){}
if(null !== $previous){}
都没有工作。
迄今可能的解决方案:
if(func_num_args() == $num_params){}
if(array_key_exists($param_index, func_get_args())){}
// 5.4
if(isset(func_get_args()[$param_index])){}
// 5.4
if(func_num_args() == (new \ReflectionMethod(__CLASS__, __FUNCTION__))
->getNumberOfParameters()){}
@DaveRandom - 所以,在以下领域:
define('_NOPARAM', '_NOPARAM' . hash('sha4096', microtime()));
function foo($bar = _NOPARAM)
{
// ...
}
@hoppa - 用例:
$obj->set_something('some_key', $some_value, $previous) // set
->do_something_that_uses_some_key()
->set_something('some_key', $previous) // and reset
->do_something_that_uses_some_key()
-> ...
代替:
$previous = $obj->get_something('some_key'); // get
$obj->set_something('some_key', $some_value) // set
->do_something_that_uses_some_key();
->set_something($previous) // and reset
->do_something_that_uses_some_key();
-> ...
可能不是你想如何解决你的问题(以某种方式测试可选参数),但这是我实现它的方式:
public function set_value($key, $value)
{
$this->_values[$key] = $value;
return $this;
}
public function set_get_value($key, $value, &$previous)
{
$previous = $this->get_value($key);
$this->_values[$key] = $value;
return $this;
}
用例示例:
$obj->set_get_something('some_key', $some_value, $previous) // set AND get
->do_something_that_uses_some_key()
->set_something('some_key', $previous) // and reset
->do_something_that_uses_some_key()
-> ...
为什么要使用其他功能
该解决方案具有以下优点:
func_num_args
或其他“元”函数的开销 编辑:代码拼写错误。
编辑2:删除&$ previous set_get_value()函数的默认值(感谢draevor)
摘自上述评论/讨论:
为了检查参数是否被传递,你有2个选项 - 根据值检查参数的值(就像你用null做的那样)或检查参数的数量。
如果你选择第一个选项,那么没有任何值无法从函数外部传递,因此总是有可能出现误报(与现在的null相同)。 对于大多数情况来说,DaveRandom的随机字符串示例应该足够了,但我认为它有点矫枉过正。
我认为第二种选择是最干净的(快速,可读等)。 作为对func_get_args
已经完成的改进的一个小改进,我使用func_num_args
- 这样你将检查传递的参数的数量,而不是参数索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.