0

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

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

PHP 非常灵活,是否有一种技术可以拦截此错误?如果是这样,这通常是如何完成的?

编辑:为了澄清,我想在发生错误时实际做一些事情,比如发回回复,不一定要阻止它。忘记提及这是在类的上下文中。当然,方法只适用于类的上下文;)

4

3 回答 3

1

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

您需要实现此处定义的__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 );
于 2013-08-19T02:05:30.860 回答
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");
于 2013-08-19T02:05:45.767 回答
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()确定这一点。

于 2013-08-19T03:23:14.980 回答