[英]Special “undefined” value for default value of argument in PHP function
我需要一個可選參數,該參數接受任何值(包括null
和false
),但仍然具有“ unspecified”狀態,以允許不同的“ default”行為。 PHP中是否有任何技術可以模仿“未定義”的值?
我想向.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;
});
}
問題是,如果有人想使用null
作為鍵,則他們將無法執行此操作,因為當前它是一個特殊的“未定義”值,這將導致使用自動順序整數來產生收益。 在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;
});
}
這是有效的方法嗎? 有沒有更清潔的方法?
您可以使用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])) {}
沒有簡單的方法來實現這一目標。 在您的情況下,用戶仍然可以使用{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();
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.