PHP函数中参数默认值的特殊“未定义”值

时间:2018-04-16 01:44:00

标签: php function default-parameters default-arguments

我需要一个接受任何值的可选参数(包括@extension UIColor { func isEqualToColor(otherColor: UIColor) -> Bool { if self == otherColor { return true } let colorSpaceRGB = CGColorSpaceCreateDeviceRGB() let convertColorToRGBSpace: ((UIColor) -> UIColor?) = { (color) -> UIColor? in guard color.cgColor.colorSpace?.model == .monochrome else { return color } guard let oldComponents = color.cgColor.components else { return nil } let newComponents = [oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]] guard let colorRef = CGColor(colorSpace: colorSpaceRGB, components: newComponents) else { return nil } return UIColor(cgColor: colorRef) } guard let selfColor = convertColorToRGBSpace(self), let otherColor = convertColorToRGBSpace(otherColor) else { return false } return selfColor.isEqual(otherColor) } } null),但仍然具有“未指定”状态以允许不同的“默认”行为。 PHP中是否有任何允许模仿“未定义”值的技术?

我想将false方法添加到我的.NET LINQ端口YaLinqo中。目前代码如下所示:

append

问题是,如果有人想使用public function append ($value, $key = null) { return new self(function () use ($value, $key) { foreach ($this as $k => $v) yield $k => $v; if ($key !== null) yield $key => $value; else yield $value; }); } 作为键,他们将无法执行此操作,因为它是当前特殊的“未定义”值,这将导致使用自动后置整数产生。在PHP中,包含序列null的迭代器完全有效,用户应该能够使用[ null => null, null => null ]生成它。

我正在考虑添加append

const UNDEFINED = '{YaLinqo.Utils.Undefined}'

这是一种有效的方法吗?有更清洁的方式吗?

2 个答案:

答案 0 :(得分:2)

您可以使用func_get_args()来达到您想要的效果。看一下下面的例子:

function test($value, $key = null) {
    var_dump(func_get_args());
}

test(1);
test(2, null);

这是输出:

array(1) {
  [0]=>
  int(1)
}
array(2) {
  [0]=>
  int(2)
  [1]=>
  NULL
}

正如您所看到的,参数列表仅包含传入的参数而非定义的参数。如果您想知道某人是否明确通过了null,您可以这样做:

$args = func_get_args();
if (isset($args[1]) && $args[1] === null) {}

或者,如果您想知道参数未通过,您可以这样做:

$args = func_get_args();
if (!isset($args[1])) {}

答案 1 :(得分:0)

没有简单的方法来实现这一目标。在您的情况下,用户仍然可以使用{YaLinqo.Utils.Undefined}值定义$ key,在这种情况下,将执行不正确的代码分支。我只能想到一个解决方案 - 我们可以分析调用堆栈帧以确定用户是否传递了一些参数。像这样:

<?php

function test() {
 func(1, null);
 func(1); 
}

function func ($x, $y = null) { 
  $stack = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 1);
  if (count($stack[0]['args']) == 2)
    echo "\$y argument is defined\n";
  else
    echo "\$y argument is UNDEFINED\n";
}

test();

?>