面向对象编程继承技术问询:子类私有成员继承及__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
相关产品推荐
相关产品推荐

