我正在学习如何使用 PHP 进行一些更高级的编程。
我已经看到调用不存在的方法会产生“调用未定义的方法”错误。
PHP 非常灵活,是否有一种技术可以拦截此错误?如果是这样,这通常是如何完成的?
编辑:为了澄清,我想在发生错误时实际做一些事情,比如发回回复,不一定要阻止它。忘记提及这是在类的上下文中。当然,方法只适用于类的上下文;)
我正在学习如何使用 PHP 进行一些更高级的编程。
我已经看到调用不存在的方法会产生“调用未定义的方法”错误。
PHP 非常灵活,是否有一种技术可以拦截此错误?如果是这样,这通常是如何完成的?
编辑:为了澄清,我想在发生错误时实际做一些事情,比如发回回复,不一定要阻止它。忘记提及这是在类的上下文中。当然,方法只适用于类的上下文;)
是的,可以使用魔术方法捕获对类的未定义方法的调用:
您需要实现此处定义的__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 );
如果你的意思是如何拦截自定义类中不存在的方法,你可以做这样的事情
<?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");
看到您不希望从这些致命错误中恢复,您可以使用关闭处理程序:
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()
确定这一点。