2016-06-10 23 views
-1

如果設置了函數參數類型,並且將錯誤類型的參數傳遞給此函數,則會觸發錯誤。問題是這個錯誤不會被運算符@所抑制。準確地說,錯誤消息是靜音的,但執行仍然停止。如何抑制無效函數參數錯誤?

function callback(DateTime $arg) { 
    return 'Success'; 
} 

function doAction(callable $callback) {  
    $value = 'Empty'; 
    $value = @$callback(123); 
    var_dump($value); // Expect `Empty` or NULL here 
} 

doAction('callback'); 

在PHP 7中,這個錯誤可以通過try-catch來捕獲。

如何使此錯誤不停止在PHP 5.x.x上執行?

+0

你可以隨時修復錯誤... –

+0

@JonStirling,這個例子儘可能簡單。 「測試」功能可能會有所不同,例如,如果它是回調。 – Finesse

+0

我不認爲這改變了我的評論。 –

回答

-1

您可以檢查函數中是否傳入了DateTime類的實例並相應地拋出錯誤。

function test(DateTime $arg) { 
    if ($arg isinstanceof DateTime) { 
     return 'Success'; 
    } else { 
     return false; 
    } 
} 
+0

參數聲明將執行'instanceof'之前觸發錯誤。 – Finesse

+0

類型運算符是'instanceof',而不是'isinstanceof'。 –

0

設置自定義錯誤處理程序,輪流這個錯誤變成一個例外:

function callback(DateTime $arg) { 
    return 'Success'; 
} 

function doAction(callable $callback) {  
    $value = 'Empty'; 

    set_error_handler(function($errno, $errstr, $errfile, $errline) { 
     if ($errno === E_RECOVERABLE_ERROR) 
      throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 

     return false; 
    }); 

    try { 
     $value = @$callback(123); 
    } catch (Exception $e) { // For PHP 5 
    } catch (Error $e) {  // For PHP 7 
    } 

    restore_error_handler(); 

    var_dump($value); // Expect `Empty` or NULL here 
} 

doAction('callback'); 
0

你有兩個選擇。

  1. 刪除類型提示並在使用之前檢查callback中的參數類型。 (我會優先考慮這一項)
  2. 在將它作爲參數傳遞之前檢查值並且不要執行回調。

注:使用錯誤控制運算符是不好的做法。