簡體   English   中英

PHP函數中參數默認值的特殊“未定義”值

[英]Special “undefined” value for default value of argument in PHP function

我需要一個可選參數,該參數接受任何值(包括nullfalse ),但仍然具有“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM