PHP和继承私有/公共变量

时间:2010-08-20 08:16:51

标签: php inheritance

我对输出的显示方式有疑问。

<?php

class Base
{
    private $privattrib = "Private Attribute1";

    function GetAttrib()
    {
        echo $this->privattrib;
    }
}

class Derived extends Base
{
    private $privattrib = "bute";
    function GetAttrib()
    {
        parent::GetAttrib();    
    }
}

$b = new Base();
$d = new Derived();
$d->GetAttrib();

&GT;

因此,对于上面的代码,我有几个问题:

  1. 当我调用parent :: GetAttrib()时,$ this的值(在Base的GetAttrib()方法中)是否现在变为Base对象,还是仍然是Derived对象?

  2. 输出为“私有属性1”。如果$ this指的是Derived对象,那么显示应该不是“bute”,因为私有属性在基类中被覆盖了吗?

  3. 如果我将两个privaattrib更改为public,则输出现在为“bute”。这是为什么?

2 个答案:

答案 0 :(得分:0)

似乎当您将属性声明为私有时,它不能被派生类覆盖。如果您将其声明为public,则可以覆盖它并由其他代码直接访问。我认为受保护意味着它可以被覆盖,但无法从外部访问。

答案 1 :(得分:0)

请注意,使用重写版本的GetAttrib调用基本版本并不是很有用;在Base中保留undefined将得到相同的结果。

  1. 将它视为Base类型的对象是有道理的,因为您不能调用仅在Derived中定义的任何函数,并且如果私有任何成员变量在两者中定义,它将使用那些来自Base。

  2. 没有;由于$ privattrib是私有的,Base的版本和Derived的版本是完全独立的。

  3. 如果您将$ privattrib成员公开,则行

    public $ privattrib =“bute”;

  4. 是对$ privattrib的重新定义,而不是对新的独立变量的声明。