写了一段时候PHP,回过头来在看PHP.感觉还是有很多地方不明白.
今天在看到private的时候遇到一个小问题, 就发个帖子请教一下大家!
<?php
class Father
{
protected $name = 'Father';
public function getName()
{
return $this->name;
}
}
class Son extends Father
{
protected $name = 'Son';
}
$son = new Son();
echo $son->getName(); //返回的是Son
另一种情况
<?php
class Father
{
private $name = 'Father';
public function getName()
{
return $this->name;
}
}
class Son extends Father
{
protected $name = 'Son';
}
$son = new Son();
echo $son->getName(); //返回的确实father
这里就有一个问题, php对象属性的值, 在程序运行的过程中是怎么确定的!
有什么规则,或者说是一个怎么样的访问过程!
我来说说我的看法。
getName是一个public方法,那么Son类会继承Father类的这个方法,这一点没有疑问,对吧。那么先看看第一段代码的执行思路。
Son类实例化之后,执行getName方法。由于这个方法是从Father类继承而来的,所以实际上这个方法访问的是Father类的$name这个属性。第一段代码里$name是protected类型的,在子类中这个属性被继承下来并被改写,那么getName就会继续去查找子类里的这个属性。而在第二段代码的里,
$name属性已经被定义成private类型,所以在子类执行getName方法时,会先查找父类里的$name属性。这时候$name是无法被继承的,所以就返回了父类的值。不知道我这样描述的是否详细,能让题主理解?
以往的工程里,我写的类访问级别只到
protected,从来不用private,我觉得这样更符合面向对象的思想。