如图所示:
private $_name = '韩'; 是父类私有属性,所以子类不能修改其值。
showName是父类方法,所以把父类的$_name = '韩'; 输出。
把private 改为 protected 或 public就可以了。
或者在Kang类重写一下showName方法。
<?phpclass Han{ public $p1 = 1; private $_name = '韩'; public function showName(){ echo '<br>p1='.$this->p1.',_name='.$this->_name; echo '<br>类:'.get_class($this).',方法:'.__METHOD__; }}class Kang extends Han{ public $p1 = 10; public $_name = '康'; public function showName(){ echo '<br>p1='.$this->p1.',_name='.$this->_name; echo '<br>类:'.get_class($this).',方法:'.__METHOD__; }}echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">';$o = new Kang;var_dump($o);echo '<br>p1='.$o->p1.',_name='.$o->_name;$o->showName();?>
private $_name = '韩'; 是父类私有属性,所以子类不能修改其值。
showName是父类方法,所以把父类的$_name = '韩'; 输出。
把private 改为 protected 或 public就可以了。
因为私有的是不可侵犯的,所以私有的属性不能被覆盖
因为私有的是不可侵犯的,所以私有的属性不能被覆盖
明明在外面,$o->_name是可以输出”康“的,而showName中的$this也就是这个$o, 则在这里面,怎么$o->_name输出的就是”韩“了呢?
showName是父类的方法,所以是调用父类的属性_name。
而$o->_name是调用子类对象的_name属性,所以会读取Kang的_name
而把private $_name改为 public $_name;,则子类实例化时,会用子类的_name覆盖父类的_name,即父类的_name等于子类的_name。
而在Kang中添加showName,这样会覆盖父类的showName方法,显示的就是子类的_name。
var_dump 反映的是 kang 的内部情况,自然私有属性也是会展示出来
showName 方法是 Han 定义的,他的 $this 自然是 Han,由于私有属性 _name 没有被覆盖所以能被他访问到
而外部只能访问到 Kang 定义的公有属性 _name
如果你在 Kang 中也定义一个 showName 那么 私有属性 _name 在 Kang 中就访问不到了
var_dump 反映的是 kang 的内部情况,自然私有属性也是会展示出来
showName 方法是 Han 定义的,他的 $this 自然是 Han,由于私有属性 _name 没有被覆盖所以能被他访问到
而外部只能访问到 Kang 定义的公有属性 _name
如果你在 Kang 中也定义一个 showName 那么 私有属性 _name 在 Kang 中就访问不到了
你把 echo '
类:'.get_class($this).',方法:'.__METHOD__;
改成 echo '
类:'. __CLASS__ .',方法:'.__METHOD__;
就可以从结果中看出了
p1=10,_name=康
p1=10,_name=韩
类: Han,方法:Han::showName
虽然 Kong 了继承了 Han 的方法 showName (__METHOD__ 为 Han::showName)
但他依然工作在 Han 类中,那么 $this->_name 就是 Han::_name 并且永远都是
如果 Han::_name 不是私有的,那么 Kong::_name 将会覆盖 Han::_name
但并不是说 $this->_name 访问的是 Kong::_name,而实际上依然是 Han::_name,只不过两个的值相同而已
嗯,9楼xuzuning版主这次的解释已经接近我想要的了,hoho。
我再就细节探讨探讨。
你让我把get_class($this),替换成__CLASS__,然后得到的是”Han”这个类名。但这只能说明showName方法所在类,因为__CLASS__永远指的是其所在方法的所属类。而并不能说明在showName方法中,$this->_name为什么是"韩",而不是“康”。而且,在这里,$this它就是“kang”类对象??不过我突然想到,它确实也是“Han”类对象,因为Kang是Han的子类,子类对象自然一定是父类的对象。由此解释的话,则$this->_name确实是应该输出Han::_name的值了。
不过你后面的解释,showName方法“依然工作在 Han 类中,那么 $this->_name 就是 Han::_name 并且永远都是”,是否过于绝对呢?比如,如果Han中没有_name这个属性,则$this->_name不就访问了Kang类对象$o(也就是这里的$this)的_name了么。但你后面的解释说,如果Han::_name不是私有的,则会被子类覆盖,然后此时访问的$this->_name将仍然是Han::_name,对我来说倒是挺新鲜的,受益匪浅。
如果Han::_name不是私有的,则会被子类覆盖,然后此时访问的$this->_name将仍然是Han::_name,是这样的。
是两个类的值,只是如果不是私有,父类的值与子类一样。
如果父类有私有的属性,那么父类的方法只为父类的私有属性服务。