如何抑制无效函数参数错误?

时间:2016-06-10 08:01:39

标签: php

如果设置了函数参数类型并且将错误类型的参数传递给此函数,则会触发错误。问题是@运算符不会抑制此错误。准确地说,错误消息是静音的,但无论如何都会停止执行。

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上执行?

3 个答案:

答案 0 :(得分:0)

设置自定义错误处理程序,将此错误转换为异常:

Point

答案 1 :(得分:0)

您有两种选择。

  1. 删除类型提示并检查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' ); 中的参数类型,然后再使用它。 (我会优先考虑这个)
  2. 在将其作为参数传递之前检查该值,并且不执行回调。
  3. 注意: 使用错误控制操作符是不好的做法。

答案 2 :(得分:-1)

你可以检查传入函数是否是DateTime类的实例并相应地抛出错误。

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