gpt4 book ai didi

php - 在 PHP 中测试可选参数

转载 作者:IT王子 更新时间:2023-10-29 00:13:27 25 4
gpt4 key购买 nike

我有几个跨类的“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();
-> ...

最佳答案

可能不是您想如何解决问题(以某种方式测试可选参数),但这就是我实现它的方式:

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()
-> ...

为什么要使用另一个函数?

这个解决方案有几个优点:

  1. 名称更明确,其他编码人员的混淆更少
  2. 没有隐藏的副作用
  3. 用(未定义的)变量已经有值解决了你的问题
  4. 没有调用 func_num_args 或其他一些“元”函数的开销

编辑:代码中的错字。

编辑 2:删除了 &$previous set_get_value() 函数的默认值(感谢 draevor)

关于php - 在 PHP 中测试可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8562359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com