2012-01-10 65 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