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,但我更希望保持错误报告不变。
有什么想法吗?
答案 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