原因是这样的,你B继承了A,test这个方法你继承下来了,但是test本身是在A类里面的,也就是说,你继承了test,但是test依旧是属于A的,那么此时test里的$this指的就是A这个对象。
如果你想要在B里调用B自己的foo的话,你可以这么做:
class B extends A {
public function foo() {
echo 'b';
}
public function test() {
parent::test(); // 调用父类的test方法,父类里的test方法调用父类自身的foo方法
$this->foo(); // 掉用自己的foo方法
}
}
整体来说的话,就是不要把继承当成属于.
另外就是官方说的是正确的,你这里并不是继承问题,而是应该弄清楚属于与不属于问题。
根据你的回复,就这个我继续做一下回答:
看一下你本身的这个例子
class A {
private function foo() {
echo 'a';
}
public function test() {
$this->foo();
}
}
class B extends A {
public function foo() {
echo 'b';
}
}
在这种情况下,如果你把A中的foo方法改成了public,那么此时foo就被继承了,而在B类里的foo方法相当于是重写了A类的foo方法,但是此时A类中的foo并没有消失,但是需要在B类中以parent::foo()这种形式来访问父类方法。这种情况方便理解,可说A中的foo方法被隐藏了。
既然被重写了,那么自然就会调用foo就是调用重写后的foo了,可以理解为既然有新的东西,那么就肯定用新东西了,新的自然优先嘛。
然后回头看为什么A中原本为private,虽然B继承了一个公共方法还是访问A类中的foo呢?首先我们看一下前提概要,也就是A类中的foo是private的,B类不可继承,那么此时就相当于有两个foo,一个是private的,一个是public的,嗯,这里要区分private与"隐藏"是不同的概念。
那么此时其实就相当于是,虽然B继承了A,但是A会首先到自己里面找,那么此时foo没有被重写,也就是没有被覆盖,那么肯定是调用自己的了。对于A来说,B你继承了我,但是我自己有,我就不要你的东西了,还是自己老婆好啊。
嗯。。。我试着用几句更简单的话来描述看看是否可行:
A: 我是A?
B: 我是B,我继承你了啊,我继承了你的test,我有foo
A:嗯,我也有foo,我不给你用
B:我被调用了啊,用的是继承了你的test
A:嗯,我看看,哦,调用了foo啊,我有
B:能用我的foo吗?
A:不能
B:好吧。。。?
再来看把A中的private变为public后:
A:我是A
B:我是B,我继承了你的test,也继承了你的foo,然而我把你的foo重写了
A:我艹你大爷?,那你用parent::foo()调用我给你的foo了么?
B:。。。没有,我现在是大爷?
A:好吧。。。
B:我被调用了啊,用的是继承了你的test
A:好吧...卧槽,foo被你重写了啊,那用你的foo
B:那是当然啊,要是还要用你的,我会用parent::foo()调用的
A:行吧,艹你大爷?