PHP 函数中参数默认值的特殊 "undefined" 值
Special "undefined" value for default value of argument in PHP function
我需要一个可选参数,它接受任何值(包括 null
和 false
),但仍然具有 "unspecified" 状态以允许不同的 "default" 行为。 PHP 中是否有任何技术允许模仿 "undefined" 值?
我想将 append
方法添加到 YaLinqo,我的 .NET LINQ 端口。目前代码如下所示:
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;
});
}
问题是,如果有人想使用 null
作为键,他们将无法做到,因为它目前是一个特殊的 "undefined" 值,这将导致使用自动连续整数。在 PHP 中,包含序列 [ null => null, null => null ]
的迭代器是完全有效的,用户应该能够使用 append
.
生成它
我正在考虑添加 const UNDEFINED = '{YaLinqo.Utils.Undefined}'
:
const UNDEFINED = '{YaLinqo.Utils.Undefined}';
public function append ($value, $key = Utils::UNDEFINED)
{
return new self(function () use ($value, $key) {
foreach ($this as $k => $v)
yield $k => $v;
if ($key !== Utils::UNDEFINED)
yield $key => $value;
else
yield $value;
});
}
这是一种有效的方法吗?有更清洁的方法吗?
没有简单的方法可以实现这一点。在您的情况下,用户仍然可以使用 {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();
?>
您可以使用 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])) {}
我需要一个可选参数,它接受任何值(包括 null
和 false
),但仍然具有 "unspecified" 状态以允许不同的 "default" 行为。 PHP 中是否有任何技术允许模仿 "undefined" 值?
我想将 append
方法添加到 YaLinqo,我的 .NET LINQ 端口。目前代码如下所示:
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;
});
}
问题是,如果有人想使用 null
作为键,他们将无法做到,因为它目前是一个特殊的 "undefined" 值,这将导致使用自动连续整数。在 PHP 中,包含序列 [ null => null, null => null ]
的迭代器是完全有效的,用户应该能够使用 append
.
我正在考虑添加 const UNDEFINED = '{YaLinqo.Utils.Undefined}'
:
const UNDEFINED = '{YaLinqo.Utils.Undefined}';
public function append ($value, $key = Utils::UNDEFINED)
{
return new self(function () use ($value, $key) {
foreach ($this as $k => $v)
yield $k => $v;
if ($key !== Utils::UNDEFINED)
yield $key => $value;
else
yield $value;
});
}
这是一种有效的方法吗?有更清洁的方法吗?
没有简单的方法可以实现这一点。在您的情况下,用户仍然可以使用 {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();
?>
您可以使用 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])) {}