在官方文档中指出,子类能继承父类的 "公有属性/方法"、"受保护的属性/方法"
疑问1:父类的私有属性会被继承吗?
疑问2:父类的私有属性可以被覆盖吗?
疑问3:$this指向"private"属性 与 $this 指向"public/protected"属性的区别?
带着上面三个问题,我们做以下的测试:
<?php
class father {
public $a = 'f_1';
protected $b = 'f_2';
private $c = 'f_3';
public function write_a(){
echo $this->a;
echo '<br/>';
}
public function write_b(){
echo $this->b;
echo '<br/>';
}
public function write_c(){
echo $this->c;
echo '<br/>';
}
}
class son extends father {
public $a = 's_1';
protected $b = 's_2';
private $c = 's_3';
public function write_a(){
parent::write_a();
echo $this->a;
}
public function write_b(){
parent::write_b();
echo $this->b;
}
public function write_c(){
parent::write_c();
echo $this->c;
}
}
$a = new son();
$a->write_a(); //输出值 s_1 s_1
echo '<br/>';
$a->write_b(); //输出值 s_2 s_2
echo '<br/>';
$a->write_c(); //输出值 f_1 s_1
通过上面的例子我们可以看出,父类的私有属性肯定是不会被覆盖的,否则不同方法中,访问的"$this->c"不会出现不同的值;
接上面的代码:
print_r($a)
// 打印出来的值
// son Object ( [a] => s_1 [b:protected] => s_2 [c:son:private] => s_3 [c:father:private] => f_3 )
我们观察到实例化类“son”后的对象"$a",发现“son”这个类也是继承了"father"当中的"c"属性,只不过在归属当中,区分了"son"中的"c"属性与"father"中的“c”属性。"son"无法使用"father"中的"c"属性。
那为什么执行
$a->write_c(); //输出值 f_1 s_1
截取上面的部分代码:
#class father 当中的代码:
public function write_c(){
echo $this->c;
echo '<br/>';
}
#class son 当中的代码:
public function write_c(){
parent::write_c();
echo $this->c;
}
输出的值不同呢?
验证1:在实例化"son"后的对象$a,"father"当中的"$this"与"son"当中的"$this"是否相同?
我们分别在对应方法中,输出$this的值进行观察:
截取上面的部分代码:
#class father 当中的代码:
public function write_c(){
print_r($this);
// son Object ( [a] => s_1 [b:protected] => s_2 [c:son:private] => s_3 [c:father:private] => f_3 )
echo $this->c;
echo '<br/>';
}
#class son 当中的代码:
public function write_c(){
print_r($this);
// son Object ( [a] => s_1 [b:protected] => s_2 [c:son:private] => s_3 [c:father:private] => f_3 )
parent::write_c();
echo $this->c;
}
$this的值是相同的(都是实例化"son"类后的对象);
这时候我们可以明确,在$this指向上,对于"private"属性与"public/protected"属性肯定是不同的。
所以说我们可以这样理解这个问题:
当实例化一个类产生对象时,如果类当中存在"私有属性"(私有方法),并且在类的任意方法中,存在$this指向"私有属性"(私有方法);此时$this指针始终指向的是$this所在类当中的"私有属性"(私有方法),不会被子类中的同名属性或者方法给覆盖。同样,子类中的"私有属性"(私有方法),父类也不可能可以通过$this直接调用。
简而言之,私有属性(私有方法)仅仅属于对其定义的类,无论该类处于继承链的哪一个辈分当中。在类当中$this指向的“私有属性”(私有方法)始终都是自己类当中定义的“私有属性”(私有方法)。
|