我正在学习使用PHP进行一些更高级的编程。
我已经看到调用一个不存在的方法会产生“调用未定义的方法”错误。
PHP非常灵活有没有一种技术可以拦截这个错误?如果是这样,通常如何做?
编辑:为了澄清,我想在发生错误时实际执行某些操作,例如发送回复,但不一定要阻止它。忘了提到这是在一个类的上下文中。当然,方法仅适用于类的上下文;)
答案 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()
来确定。