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

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

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

注意,注意, 注意:虽说get_called_class()是用于静态方法调用,但它也可用于类的非静态方法中,但必须强调一点,get_called_class()所处的函数必须在类里面;

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

01 <?php
02 if (!function_exists( 'get_called_class' ))
03 {
04 class classTools
05 {
06 private static $i = 0;
07 private static $file = null;
09 public static function get_called_class()
10 {
11 $bt = debug_backtrace();
13 // 使用 call_user_func 或 call_user_func_array 函数调用类方法,处理如下
14 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' ))
15 )
16 {
17 // 如果参数是数组
18 if ( is_array ( $bt [3][ 'args' ][0]))
19 {
20 $toret = $bt [3][ 'args' ][0][0];
22 return $toret ;
23 }
24 else if ( is_string ( $bt [3][ 'args' ][0]))
25 {
26 // 如果参数是字符串
27 // 如果是字符串且字符串中包含::符号,则认为是正确的参数类型,计算并返回类名
28 if (false !== strpos ( $bt [3][ 'args' ][0], '::' ))
29 {
30 $toret = explode ( '::' , $bt [3][ 'args' ][0]);
32 return $toret [0];
33 }
34 }
35 }
37 // 使用正常途径调用类方法,如:A::make()
38 if (self:: $file == $bt [2][ 'file' ] . $bt [2][ 'line' ])
39 {
40 self:: $i ++;
41 }
42 else
43 {
44 self:: $i = 0;
45 self:: $file = $bt [2][ 'file' ] . $bt [2][ 'line' ];
46 }
47 $lines = file( $bt [2][ 'file' ]);
48 preg_match_all( '/([a-zA-Z0-9\_]+)::' . $bt [2][ 'function' ] . '/' , $lines [ $bt [2][ 'line' ] - 1], $matches );
50 return $matches [1][self:: $i ];
51 }
52 }
54 function get_called_class()
55 {
56 return classTools::get_called_class();
57 }
58 }

现在,把例子修改下:

01 <?php
02 class A
03 {
04 function __construct()
05 {
06 echo get_class( $this );
07 }
09 static function name()
10 {
11 echo get_called_class();
12 }
13 }
15 class B extends A
16 {
17 }
19 $objB = new B(); // 输出 B
20 B::name(); // 输出 B

呵呵,这是我想要的结果!
转载出处:http://blog.snsgou.com/post-874.html?utm_source=tuicool

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 获取 分类下面的所有 子类 方法 : static function getMenuTree($arr Ca t, $parent_id = 0, $level = 0,$all=True) { static $arrTree; //使用static代替global if(!$all) $arrTree =''; if( empty... 我想要做的是找到扩展某个基类的所有 子类 .基本上,我希望做的是:>将所有 PHP 文件包含在目录中.>测试每个include是否引入了基类的新 子类 .但我想在一个孤立的 PHP 环境中进行包含,这样我就可以避免因包含 PHP 文件而引入的任何错误和警告.这是一个小例子:Base Class . php abstract class Base Class {}?>FirstSub class . php class ... 获取 分类以下的全部 子类 方法 :static function getMenuTree($arr Ca t, $parent_id = 0, $level = 0,$all=True){static $arrTree; //使用static取代globalif(!$all) $arrTree ='';if( empty($arr Ca t)) return FALSE;$level++;if($level ... function GetSon($PID=''){$this->dataconnect();if($PID=='') return;$returnSiteID = null;if($PID == 0){$returnSiteID = $this->db->GetCol("SELECT SiteID FROM cms_r_site WHERE PublishMode=1 ORDER... 看了一下datastore的入门,以及开始采用MVC方式来写 php ,于是想拿 php 为redis写个model,可以实现一些datastore的基本功能...于是碰到这样一个问题-.- php 里__ CLASS __这类东西是静态绑定的,如果不再 子类 里重载的话,那么 继承 父类 方法 所得到的依旧是父类的 称而不是 子类 称。比如: class A{function __construct(){echo __CLA... 我在构建ORM库时要考虑到重用和简单性。一切都进行得很好,除了我被愚蠢的 继承 限制所困。请考虑以下代码: class BaseModel {/** Return an instance of a Model from the database.*/static public function get (/* varargs */) {// 1. Notice we want an instance o... 获取 分类下面的所有 子类 方法 :static function getMenuTree($arr Ca t, $parent_id = 0, $level = 0,$all=True) { static $arrTree; //使用static代替global if(!$all) $arrTree =''; if( empty($arr Ca t)) retu... PHP 中通过 __ CLASS __ 可以 获取 当前的类 ,但它是静态绑定的,如果不在 子类 里重载的话,那么 继承 父类 方法 所得到的依旧是父类的 称,而不是 子类 称,比如: <? php class Base { function __construct() { echo __ CLASS __; static function get Class () { echo __ CLASS __; class Child extends Base php 继承 方法 获取 子类 看了一下datastore的入门,以及开始采用MVC方式来写 php ,于是想拿 php 为redis写个model,可以实现一些datastore的基本功能...于是碰到这样一个问题-.- php 里__ CLASS __这类东西是静态绑定的,如果不再 子类 里重载的话,那么 继承 父类 方法 所得到的依旧是父类的 称而不是 子类 称。比如: class A{function __construct...