//PHP<5.3版本支持get_called_class()方法
if (!function_exists('get_called_class')) {
class class_tools {
private static $i = 0;
private static $fl = null;
public static function get_called_class() {
$bt = debug_backtrace();
//使用call_user_func或call_user_func_array函数调用类方法,处理如下
if (array_key_exists(3, $bt)
&& array_key_exists('function', $bt[3])
&& in_array($bt[3]['function'], array('call_user_func', 'call_user_func_array'))
) {
//如果参数是数组
if (is_array($bt[3]['args'][0])) {
$toret = $bt[3]['args'][0][0];
return $toret;
} else if (is_string($bt[3]['args'][0])) {//如果参数是字符串
//如果是字符串且字符串中包含::符号,则认为是正确的参数类型,计算并返回类名
if (false !== strpos($bt[3]['args'][0], '::')) {
$toret = explode('::', $bt[3]['args'][0]);
return $toret[0];
}
}
}
//使用正常途径调用类方法,如:A::make()
if (self::$fl == $bt[2]['file'] . $bt[2]['line']) {
self::$i++;
} else {
self::$i = 0;
self::$fl = $bt[2]['file'] . $bt[2]['line'];
}
$lines = file($bt[2]['file']);
preg_match_all('/([a-zA-Z0-9\_]+)::' . $bt[2]['function'] . '/', $lines[$bt[2]['line'] - 1], $matches);
return $matches[1][self::$i];
}
}
/**
* 获取当前调用所在的类名,用于静态成员方法中
* @return string
*/
function get_called_class() {
return class_tools::get_called_class();
}
}