当前位置:编程学习 > php >>

PHP中如何获得当前类的名称,而实例化后获取子类的名称

class all

{

  function all()

  {

    return __CLASS__;

  }

}

 

class my extends all

{

 

}

print my::all();

 

这样获得的是父类的名称,我想获得  my ,请问用什么函数啊?

追问:可是。。。重载不太合理吧。。。

 

有没有更好的办法啊

答案:这是php静态数据过早绑定的问题(即子类的all方法是从父类中继承过来的,__CLASS__常量过早的绑定成了父类名),解决这个问题:方法一:class all{  function all()  {    return __CLASS__;  }} class my extends all{ function all() { return __CLASS__; }}//子类定义同名的方法(这其实就是覆盖了父类的方法,让__CLASS__绑定为自己的类名)echo my::all();
方法二:class all{  function all()  {    return get_class($this);  }} class my extends all{}$my = new my();//非静态调用是不存在过早绑定的情况的。echo $my->all();
这个可以看看php5.3.0版本之后的静态迟绑定相关信息(static关键字)

php 4.3以后新增了一个魔术常量__CLASS__,用来获得当前class名称。但是在下面的代码中,却不work。

class A {
 function showclass() {
     echo __CLASS__;
 }
}
class B extends A {}
 
A::showclass();
B::showclass();

这段代码会打出两个A,而不是预想中的AB。

下面这段代码,利用debug_backtrace来获得当前class名,可惜只能在php4上面work,到了php5以上,测试结果全部都是AA-___-

class A {
   function showclass() {
      $backtrace = debug_backtrace();
      echo $backtrace[0]['class'];
   }
}
 
class B extends A {}

补充一个可以在php4/php5下work的代码

class A {
 function showclass() {
    $backtrace = debug_backtrace();
    echo ((int)PHP_VERSION> 4) ?
        get_class($backtrace[0]['object']) : $backtrace[0]['class'];
 }
}
class B extends A {}

上一个:请问php中的符号表是什么样的概念! - PHP进阶讨论
下一个:解释一下这两个函数的执行过程?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,