我有一些跨类的"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
的参数传递的变量之前并没有在它的作用域中定义,而且它的缺省值无论如何都是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();
-> ...
https://stackoverflow.com/questions/8562359
复制相似问题