2012-01-10 68 views
0

引申https://stackoverflow.com/a/55191/547210
我创建一个验证函数来检查字符串变量,这可能会或可能不会被设置的几个属性。 (被检查的属性之一)
我正在试图做的事情是在表单中接收参数未知数量的参数(见下文),并抑制可能由传递未设置变量导致的错误。
我通过使用func_get_args()
接收像validate([ mixed $... ])这样的变量上一篇文章提到通过引用传递它是可能的,现在是否可以在隐式地传递变量时这样做?PHP抑制功能错误参数

回答

0

如果您传递的调用范围中未设置变量,则func_get_args()返回的数组将在变量传递的位置包含NULL值,并且将触发错误。这个错误不是在函数代码本身触发的,而是在函数调用中触发的。因此,在函数的代码中,没有什么可以做到的来抑制这个错误。

考虑一下:

function accepts_some_args() { 
    $args = func_get_args(); 
    var_dump($args); 
} 

$myVar = 'value'; 
accepts_some_args($notSet, $myVar); 

/* 
    Ouput: 

    Notice: Undefined variable: notSet in... 
    array(2) { 
    [0]=> 
    NULL 
    [1]=> 
    string(5) "value" 
    } 
*/ 

正如你所看到的,变量名notSet出现错误,告诉我们错误是在调用者的范围引发的,而不是被调用的。

如果我们要对付的错误,我们可以这样做:

accepts_some_args(@$notSet, $myVar); 

...和前缀与邪恶@操作变量名,但更好的解决办法是不同的结构我们的代码,所以我们可以自己做检查:

function accepts_some_args ($args) { 
    var_dump($args); 
} 

$myVar = 'value'; 

$toPassToFunction = array(); 
$toPassToFunction[] = (isset($notSet)) ? $notSet : NULL; 
$toPassToFunction[] = (isset($myVar)) ? $myVar : NULL; 

accepts_some_args($toPassToFunction); 

/* 
    Ouput: 

    array(2) { 
    [0]=> 
    NULL 
    [1]=> 
    string(5) "value" 
    } 
*/ 
+0

在我看来,“邪恶”@符号比你的“更好的解决方案”更简洁的代码,因此不太可能引入错误。 – 2012-01-10 22:08:38

+0

较短并不意味着更清洁。通过明确禁止某个特定代码段的错误,可能会隐藏阻止代码在别处工作的错误。有一些极少数情况下使用'@'是合法的(特别是'fopen()'),但它们很少。当然,使用它来抑制尝试使用未定义变量的错误是*不正确的用法。就像'goto'辩论 - 有些情况下,他们的使用是可以接受的,甚至是好的,但大多数人不知道如何确定这一点,所以最好的方法是“不”。 – DaveRandom 2012-01-10 22:16:02

+0

我认为这不会是一个简单的答案,只是我必须对'$ _POST'中的许多变量执行相同的验证规则集合,而不是首先检查isset,然后循环执行每个规则,这似乎是一种明智的方法,可以削减代码数量,实现同样的功能。出于兴趣,当函数使用isset测试每个变量时,使用'@'会导致什么样的错误? – Olirav 2012-01-10 22:44:46