明明在外面,$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 中就访问不到了
class 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();
?>
我要的是“解释”,就是为什么这里输出的是“韩”而不是“康”?不是为了要输出这个“康”这个属性数据。
你说的这个“showName是父类方法,所以把父类的$_name = '韩'; 输出。”,略算解释,但我还是想要更深入的说法。
我知道showName是父类方法,输出的"韩“是父类的私有属性值。
我的意思是,"$o"这个对象,也就是showName中的$this,明明是有公有属性_name, 和p1,为什么在其中p1可以输出10,而_name输出的是私有的那个,而不是公有的那个?(我们可以观察到,$o也就是$this中有2个_name,一个公有,一个私有)。
明明在外面,$o->_name是可以输出”康“的,而showName中的$this也就是这个$o, 则在这里面,怎么$o->_name输出的就是”韩“了呢?谢谢 fdipzone!
而$o->_name是调用子类对象的_name属性,所以会读取Kang的_name而把private $_name改为 public $_name;,则子类实例化时,会用子类的_name覆盖父类的_name,即父类的_name等于子类的_name。而在Kang中添加showName,这样会覆盖父类的showName方法,显示的就是子类的_name。
而外部只能访问到 Kang 定义的公有属性 _name如果你在 Kang 中也定义一个 showName 那么 私有属性 _name 在 Kang 中就访问不到了
其他的我都能认可,能理解,但关于这一句“showName 方法是 Han 定义的,他的 $this 自然是 Han”,我实际测试其实是,$this和$o是“全等”的,实际上就是一个对象($o)。
另外,从var_dump($o)看到的对象$o的内部情况,确实可以看到它有两个_name属性,一个是公有的,一个是私有的。或者,理论上,在showName中,这两个其实都能访问到。比如,把Han类中的私有属性_name注释掉,就可以访问其子类的公有的_name属性了。
实际上,我的问题,就在这里:为什么这里输出的是私有的那个_name,而不是共有的那个_name。
我想要知道的是一个理论上的解释,或原理上的解释,至于现象,或单纯的解释为“因为showName是Han类定义的,所以Han类中的私有属性可以被其访问到”,我是知道的。
这里可以肯定的是,$o对象有两个_name属性,一个来自Han类的私有,一个来自Kang类的公有,showName()方法对这两个都可以访问到。我想到的一个可能的解释是:方法优先访问其所在类中定义的”同属一类“的属性。但实际上,这个解释是我想象出来的,我没有在哪里见过。所以,我就想要知道,一个更深入的有关此现象的解释。
ok?谢谢各位!
改成 echo '<br>类:'. __CLASS__ .',方法:'.__METHOD__;
就可以从结果中看出了
<br>p1=10,_name=康<br>p1=10,_name=韩<br>类: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,只不过两个的值相同而已
不过你后面的解释,showName方法“依然工作在 Han 类中,那么 $this->_name 就是 Han::_name 并且永远都是”,是否过于绝对呢?比如,如果Han中没有_name这个属性,则$this->_name不就访问了Kang类对象$o(也就是这里的$this)的_name了么。但你后面的解释说,如果Han::_name不是私有的,则会被子类覆盖,然后此时访问的$this->_name将仍然是Han::_name,对我来说倒是挺新鲜的,受益匪浅。
是两个类的值,只是如果不是私有,父类的值与子类一样。