<?php
class Par
{
protected $list = array(1);
// private $list = array(1);
public function dump()
{
/**
* 如果 list 是 private 的,则子类继承 dump 方法后,只能访问父类的 list 属性
* 如果 list 是非 private 的,则会优先访问自己的 list,然后才是父类的 list 属性
*/
var_dump($this->list);
echo '<br/><br/>';
// 如果是 Par 的实例调用 dump() 方法,则 $this 指向 Par 的实例
// 否则若是 Child 的实例调用 dump() 方法,则 $this 指向 Child 的实例
var_dump($this);
/**
* 方法 testEcho() 的继承和 list 属性的继承方式一样
*/
$this->testEcho();
}
protected function testEcho()
{
echo '<br/>class par';
echo '<br/>';
}
}
class Child extends Par
{
public $list = array(1, 2);
public function testEcho()
{
echo '<br/>class child';
echo '<br/>';
}
}
$obj = new Child();
$obj->dump();
总结:
1. 子类调用从父类中继承的某个方法,若此方法访问一个在父类中存在且非 private 的属性的几种情况:
1)若子类存在同名属性,则最终访问的是子类的这个属性
2)若子类中不存在同名属性,则最终访问的是父类的这个属性
3)若此属性在父类中存在且是 private 的,则始终访问的是父类的这个属性
2. 子类调用从父类中继承的某个方法,若此方法又调用一个父类中存在且非 private 的方法的情况和上面属性的一样
3. Java 中对于第一种情况的处理方式不同,只要调用的方法是从父类中继承过来的,则此方法只能访问父类的属性,而不能访问子类的属性(不管采用何种修饰符)