You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面向对象编程继承技术问询:子类私有成员继承及__CLASS__关键字问题

PHP面向对象继承常见问题解析

刚好碰到过类似的疑惑,给你逐一拆解这几个问题:

1. 子类是否继承父类的私有成员?

一句话总结:子类不会真正继承父类的私有成员(private修饰的属性/方法),但会间接持有这些成员的副本——不过子类自身完全没有直接访问它们的权限,只有父类自己的成员方法才能操作这些私有成员。

2. 两个具体的PHP继承代码疑问

(1) 子类调用父类方法为何能输出私有属性?

先看你给出的代码:

class Test { 
    private $name = "Youhana"; 
    function getPrivate(){ 
        echo $this->name ; 
    } 
} 
Class Test2 extends Test { } 
$obj2 = new Test2(); 
$obj2->getPrivate();

这里的核心是方法的作用域:getPrivate()是父类Test定义的方法,它的执行上下文属于Test类。当子类Test2的对象调用这个方法时,$this指向的是当前的Test2实例,但方法本身是在父类的作用域里运行的——父类的方法天然有权访问自己类的私有属性,哪怕这个方法是被子类对象触发的。

举个反例验证:如果你在Test2里新增一个方法直接访问$this->name,比如:

Class Test2 extends Test { 
    function tryGetName() {
        echo $this->name;
    }
}

调用$obj2->tryGetName()一定会报错,因为子类自身确实没有访问父类私有成员的权限。

(2) 调用子类对象的方法,__CLASS__为何返回父类名?

再看这段代码:

Class Ex1{ 
    function checkClassName(){ 
        var_dump(__CLASS__); 
    } 
} 
Class Ex2 extends Ex1{ } 
$obj2 = new Ex2(); 
$obj2->checkClassName();

这是__CLASS__关键字的特性决定的:它返回的是当前方法所在类的名称,而不是调用该方法的对象所属的类。

checkClassName()是定义在Ex1里的,所以不管是Ex1对象还是它的子类Ex2对象调用这个方法,__CLASS__都会固定返回Ex1。如果想获取调用对象的实际类名,你可以用get_class($this)或者$this::class来替代,修改后的方法如下:

function checkClassName(){ 
    var_dump(get_class($this)); // 此时会返回"Ex2"
}

内容的提问来源于stack exchange,提问作者youhana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:14:15