添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

而实际上我想要得到的是 子类B 的名称!那如何实现呢?

PHP自带两个函数 get_class() get_called_class() 可以解决这个问题。

get_class() 用于实例调用,加入参数($this)可解决子类继承调用的问题,而 get_called_class() 则是用于静态方法调用。

需要注意的是 get_called_class() 需要 PHP>=5.3.0 才支持,官方手册: http://php.net/manual/en/function.get-called-class.php ,对于 PHP5.3.0以下的版本,有人给出了如下实现方式:

if (!function_exists('get_called_class')) class classTools private static $i = 0; private static $file = 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::$file == $bt[2]['file'] . $bt[2]['line']) self::$i++; self::$i = 0; self::$file = $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]; function get_called_class() return classTools::get_called_class();

现在,把例子修改下:

class A function __construct() echo get_class($this); static function name() echo get_called_class(); class B extends A $objB = new B(); // 输出 B B::name(); // 输出 B

呵呵,这是我想要的结果!

延伸阅读:

PHP get_class 返回对象的类名

PHP get_class_methods函数用法

父类方法返回子类实例:PHP延迟静态绑定