写了一段时候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
,我觉得这样更符合面向对象的思想。你试试看这个 https://segmentfault.com/q/1010000000133607
是不是你的也有警告提示但是因为设置的原因没有显示出来呢?
按说父类声明了 private $attr的话子类可以 private $attr,但是不能 protected $attr 或者 public $attr,否则会很混乱,类似的例子 父类 protected $attr;子类 public $attr;那返回哪个。
既然已经面向对象了,那么
对象
这个词也肯定也不是空穴来风,话说世界万物皆对象,也不知道当初提出面向对象的人脑子里想的是谁家的对象。这个面向对象的概念大到了保持对整个世界的同理心!!!你看看提出面向对象的人,都有这么高的Bigger。那我们学习面向对象,也至少不应该只局限在编程里。
说道爹,就应该好好唠一唠,这个是一个拼爹的时代。
我爹在前门有套房,我爹的媳妇我叫娘,我爹外号叫光头强。
说到我啊,他们制造我的时候是这个样子
我爹在前门有套房
我爹的媳妇我叫娘
我的外号叫夜夜强
共有 谁都能给你起个外号,约束不了
私有 爹的房子,你始终改不成你的,只能炫耀下。
保护 家族中的一个属性
第一个父类name被重写了,所以就只有一个name。
第二个父类name没有被重写,所以调用父类的私有属性。