欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php如何获取当前类名,继承中的问题?

程序员文章站 2022-05-13 14:11:44
...
木有标题所说的那么简单!!

问题是 :

PHP中 A类继承了B类,如何在A类中获取B类的类名

实际使用状况是:

B类是一个基类,多个类A,C,D.....需要继承B类.我想在B类中写一些日志,来记录A类的运行情况

回复内容:

木有标题所说的那么简单!!


问题是 :

PHP中 A类继承了B类,如何在A类中获取B类的类名

实际使用状况是:

B类是一个基类,多个类A,C,D.....需要继承B类.我想在B类中写一些日志,来记录A类的运行情况

我的方式比较简单,在B类中定义一个属性,B的构造函数里__CLASS__赋值给这个属性,子类里调用这个属性就知道B的类名了。
代码:
class B{

    protected $name = '';
    public function __construct(){
        $this->name = __CLASS__;
    }
}
class A extends B{
    public function _show(){
        echo $this->name;
    }
}
$temp = new A();
$temp->_show();

定义一个函数就行了呗。
基类和子类是可以互相调用的。

你在B类(字类)写一个函数:

private function getChildName(){
    return __CLASS__;
}

你在A类(基类)调用即可:

$this->getChildName();

多个继承要想在子类获取父类名 1.使用反射 2.使用回调(包括子父类间调用) 3.在父类定义self类方法。

楼主提的问题好像是:

因为A,C,D都是继承的B,但是B里面的函数需要得到「是A,还是C」?

class Base {
    public function log() {

        // 目标类,输出:A、C
        echo static::class;
        //echo get_called_class();
        //echo get_class($this);
        
        
        // 基类,输出:Base
        //echo __CLASS__; 
        //echo self::class;
        
    }
}

class A extends Base {}
class C extends Base {}


echo (new A)->log();  // 输出: A
echo (new C)->log();  // 输出: C

如果你的需求是在A里面,得知继承的谁,这可以用到反射了

// 类外获得
$a = new A();
echo get_parent_class($a);

//类中获得
class C extends Base {
    public function log1() {
       echo get_parent_class($this);
    }
}

// 反射,取出所有extends的父级
// 如上,在C类中,$a换成$this即可
$class = new ReflectionClass($a);
$parents = [];
while ($class = $class->getParentClass()) {  // 查询 implements 用 getInterfaces  
     $parents[] = $class->getName();
}

print_r($parents);

> 更多信息,自己看

  • 调试

    • debug_backtrace

  • 反射

    • ReflectionClass

  • 函数

    • get_called_class

    • get_class

    • get_class_methods

    • get_class_vars

    • get_object_vars

    • get_parent_class

    • method_exists

相关标签: php