为“调用未定义方法”错误提供被调用者响应?

时间:2013-08-19 01:59:07

标签: php class error-handling call

我正在学习使用PHP进行一些更高级的编程。

我已经看到调用一个不存在的方法会产生“调用未定义的方法”错误。

PHP非常灵活有没有一种技术可以拦截这个错误?如果是这样,通常如何做?

编辑:为了澄清,我想在发生错误时实际执行某些操作,例如发送回复,但不一定要阻止它。忘了提到这是在一个类的上下文中。当然,方法仅适用于类的上下文;)

3 个答案:

答案 0 :(得分:1)

是的,可以使用魔术方法捕获对未定义类方法的调用:

您需要实施定义here__call()和/或__callStatic()方法。

假设你有一个简单的类CCalculationHelper,只有几个方法:

class CCalculationHelper {

  static public function add( $op1, $op2 ) {

    assert(  is_numeric( $op1 ));
    assert(  is_numeric( $op2 ));

    return ( $op1 + $op2 );

  }

  static public function diff( $op1, $op2 ) {

    assert(  is_numeric( $op1 ));
    assert(  is_numeric( $op2 ));

    return ( $op1 - $op2 );

  }

}

稍后,您需要通过乘法或除法来增强此类。您可以使用魔术方法来实现这两种操作,而不是使用两种显式方法:

class CCalculationHelper {

  /**  As of PHP 5.3.0  */
  static public function __callStatic( $calledStaticMethodName, $arguments ) {

    assert( 2 == count( $arguments  ));
    assert( is_numeric( $arguments[ 0 ] ));
    assert( is_numeric( $arguments[ 1 ] ));

    switch( $calledStaticMethodName ) {

       case 'mult':
          return $arguments[ 0 ] * $arguments[ 1 ];
          break;

       case 'div':
          return $arguments[ 0 ] / $arguments[ 1 ];
          break;

    }

    $msg = 'Sorry, static method "' . $calledStaticMethodName . '" not defined in class "' . __CLASS__ . '"';
    throw new Exception( $msg, -1 );

  }

  ... rest as before... 

}

这样称呼:

  $result = CCalculationHelper::mult( 12, 15 );

答案 1 :(得分:1)

如果您的意思是如何拦截自定义类中不存在的方法,则可以执行以下操作

<?php
    class CustomObject {
        public function __call($name, $arguments) {
            echo "You are calling this function: " . 
            $name . "(" . implode(', ', $arguments) . ")";
        }
    }

    $obj = new CustomObject();
    $obj->HelloWorld("I love you");
?>

或者如果你想拦截所有错误

function error_handler($errno, $errstr, $errfile, $errline) {
    // handle error here.
    return true;
}
set_error_handler("error_handler");

答案 2 :(得分:1)

如果您不希望从这些致命错误中恢复,可以使用关机处理程序:

function on_shutdown()
{
    if (($last_error = error_get_last()) {
        // uh oh, an error occurred, do last minute stuff
    }
}

register_shutdown_function('on_shutdown');

无论是否发生错误,都会在脚本末尾调用该函数;调用error_get_last()来确定。