class base
{
public function test()
{
$this->testPublic();
$this->testProtected();
$this->testPrivate();
}
public function testPublic()
{
echo 'base public' . '<br>';
}
protected function testProtected()
{
echo 'base protected' . '<br>';
}
private function testPrivate()
{
echo 'base private' . '<br>';
}
}
class Ext extends base
{
public function testPublic()
{
echo 'ext public' . '<br>';
}
protected function testProtected()
{
echo 'ext protected' . '<br>';
}
private function testPrivate()
{
echo 'ext private' . '<br>';
}
}
(new Ext())->test();
输出
ext public
ext protected
base private
public / protected 应该很好理解,直接被覆盖掉了。
但是这个 private 有点疑问,首先 private 默认是 final 是不可以被覆盖的,但是按照继承的原则,是可以被继承的(只是子类的代码不能访问),另外 $this 是指向的调用者( Ext 对象),那这个 $this 该如何理解?
看 Thinking in java ,里面说子类初始化出对象时,会在内部默认创建一个父类的对象,毕竟是权威写的,但是找了很久,有个比较有说服力的是父类并没有创建一个对象(假设父类是 abstract 该如何创建对象?),而只是父类 .class 的 hash key 。
另外翻了翻 php 的 extend 实现的源码, function 的继承:
貌似继承是在编译阶段确定下来的?是不是意思是:并没有所谓的内含的父类对象,仅仅是子类把父类的代码按照可见性合到了一起?( static 延迟绑定暂不讨论),假如是这样的话,$this 是什么时候确定下来的呢?
1
vus520 2016-09-12 17:41:29 +08:00 1
final private function testPrivate()
{ echo 'base private' . '<br>'; } 很显然,这里不是默认的 final |
2
bombless 2016-09-12 18:06:43 +08:00 1
3p 不是可见性,是可访问性
说的想起来我们悲剧的 pub/non-pub 影响可见性的 use 语句设计(捂脸 |
3
SoloCompany 2016-09-12 22:31:29 +08:00 1
|