首页  >  问答  >  正文

PHP private

写了一段时候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对象属性的值, 在程序运行的过程中是怎么确定的!
有什么规则,或者说是一个怎么样的访问过程!

黄舟黄舟2773 天前557

全部回复(4)我来回复

  • 迷茫

    迷茫2017-04-10 17:08:28

    我来说说我的看法。

    getName 是一个 public 方法,那么 Son 类会继承 Father 类的这个方法,这一点没有疑问,对吧。

    那么先看看第一段代码的执行思路。

    Son 类实例化之后,执行 getName 方法。由于这个方法是从 Father 类继承而来的,所以实际上这个方法访问的是 Father 类的 $name 这个属性。第一段代码里 $nameprotected 类型的,在子类中这个属性被继承下来并被改写,那么 getName 就会继续去查找子类里的这个属性。

    而在第二段代码的里,$name 属性已经被定义成 private 类型,所以在子类执行 getName 方法时,会先查找父类里的 $name 属性。这时候 $name 是无法被继承的,所以就返回了父类的值。

    不知道我这样描述的是否详细,能让题主理解?

    以往的工程里,我写的类访问级别只到 protected,从来不用 private,我觉得这样更符合面向对象的思想。

    回复
    0
  • PHP中文网

    PHP中文网2017-04-10 17:08:28

    你试试看这个 https://segmentfault.com/q/1010000000133607
    是不是你的也有警告提示但是因为设置的原因没有显示出来呢?
    按说父类声明了 private $attr的话子类可以 private $attr,但是不能 protected $attr 或者 public $attr,否则会很混乱,类似的例子 父类 protected $attr;子类 public $attr;那返回哪个。

    回复
    0
  • PHP中文网

    PHP中文网2017-04-10 17:08:28

    我发现黑客新想法的最佳来源,并非是名字里有“计算机”三个字的领域,而是来自于其他的创作领域 --《黑客与画家》21页

    既然已经面向对象了,那么对象这个词也肯定也不是空穴来风,话说世界万物皆对象,也不知道当初提出面向对象的人脑子里想的是谁家的对象。这个面向对象的概念大到了保持对整个世界的同理心!!!

    你看看提出面向对象的人,都有这么高的Bigger。那我们学习面向对象,也至少不应该只局限在编程里。

    说道爹,就应该好好唠一唠,这个是一个拼爹的时代。
    我爹在前门有套房,我爹的媳妇我叫娘,我爹外号叫光头强。

    class Father {
        private $fatherHouse  = '我爹在前门的四合院,房产证上只写着爹的名字';
        protected $fatherWife = "我爹的媳妇";
        public $nickname      = "光头强";
        
        public function whereFatherHouse(){
            echo $this->fatherHouse;
        }
    
        public function callFatherWife(){
            echo $this->fatherWife;
        }
    }

    说到我啊,他们制造我的时候是这个样子

    class Me extends Father {
        protected $fatherWife = '娘';
    }
    $me = new Me();

    我爹在前门有套房

    $me->whereFatherHouse(); 

    我爹的媳妇我叫娘

    $me->callFatherWife();

    我的外号叫夜夜强

    $me->nickname = '夜夜强';

    共有 谁都能给你起个外号,约束不了
    私有 爹的房子,你始终改不成你的,只能炫耀下。
    保护 家族中的一个属性

    回复
    0
  • 阿神

    阿神2017-04-10 17:08:28

    第一个父类name被重写了,所以就只有一个name。
    第二个父类name没有被重写,所以调用父类的私有属性。

    回复
    0
  • 取消回复