php如何获取当前类名,继承中的问题?
PHPz
PHPz 2017-04-11 10:32:21
[PHP讨论组]

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


问题是 :

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

实际使用状况是:

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

PHPz
PHPz

学习是最好的投资!

全部回复(4)
PHPz

楼主提的问题好像是:

因为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中文网

我的方式比较简单,在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();
PHP中文网

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

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

private function getChildName(){
    return __CLASS__;
}

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

$this->getChildName();
阿神

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号