传递一个可能没有设置为函数的参数,而不会发出通知

时间:2014-03-25 14:38:37

标签: php function parameters

PHP有isset()函数,它接受一个变量,并告诉你它是否已设置。传递不存在的数组键时,它不会发出通知。我想在一个新功能中复制该功能,这个功能是这样的:

function my_function($arg1, $arg2) {
    if(isset($arg1)) {
        //...do something
    } else {
        //...do something else
    }
}

或最终是这样的:

function my_function() {
    $arglist = func_get_args();
    foreach($arglist as $arg) {
        if(isset($arg)) {
            // ... do something
        }
    }
}

显然,这些功能不起作用。我可以使用@来抑制所有错误,然后只测试null,但我更希望保持错误报告不变。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以为参数指定默认值,然后在调用函数时检查它们是否设置为默认值。在这种情况下,我使用了null

function my_function($arg1=null, $arg2=null) {
    if(!is_null($arg1)) {
        //...do something
    } else {
        //...do something else
    }
}

答案 1 :(得分:1)

function my_function($arg1, $arg2) {

在此函数中,$arg1$arg2将始终 set ,因为您在函数签名中声明了这些变量。在此函数中检查isset是没有意义的。

调用此函数时,您将一些完全不同的变量传递给它:

my_function($foo, $bar);

我猜你要避免在调用范围内检查$foo$bar是否设置。这是不可能的。 $foo是与$arg1不同的变量。您需要检查$foo是否存在于$foo应该存在的范围内,my_function与该范围无关。

function my_function($arg1) {
    if (isset($arg1)) ...
}

my_function($foo);
              ^
              |
              +--- error is thrown here, code inside my_function can't help

可能有各种精心设计的方法可以避免写isset,但不要去那里。在必要时写isset,避免必须通过适当地声明变量应该存在的位置来编写isset

my_function(isset($foo) ? $foo : null);

事实上,您实际上无法确定是否设置了整个变量的唯一时间是用户输入,主要是通过$_POST$_GET。对于那些你必须检查。您可以完全控制应用程序中的任何其他变量,并确保它们存在于应存在的位置。

答案 2 :(得分:1)

所以,经过广泛的愚弄,基于给出的答案,我找到了解决方案!

问题是作用域之一,当您使用值调用函数时,错误检查会在赋值时发生。

<强>无论其

如果您通过引用传递变量,则不会触发错误检查!事实上,引用被传递,并且在第一次使用错误时会抛出错误,函数内部!

// returns an HTML-safe version of the first defined, non-falsey argument
function print_OR(&$highp = null, &$lowp = null, &$default=null) {
    if(isset($highp)&&($highp||$highp===0)) return htmlspecialchars($highp);
    if(isset($lowp )&&($lowp ||$lowp ===0)) return htmlspecialchars($lowp);
    return htmlspecialchars($default);
}

以下是一组测试,将其显示为功能:http://pastebin.com/C9QTvSi7