2010-08-20 88 views
2

我有一个关于输出显示方式的问题。私有/公共变量的PHP和继承

<?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(); 

>

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

  1. 当我打电话父:: GetAttrib(),做的$ this的值(在Base的GetAttrib()方法)现在成为一个Base对象,还是它仍然是一个Derived对象?

  2. 输出是“Private Attribute1”。如果$ this引用了一个Derived对象,那么不应该显示为“bute”,因为private属性在基类中被覆盖了吗?

  3. 如果我将两个私有属性都更改为public,则输出现在是“bute”。为什么是这样?

回答

0

请注意,具有GetAttrib的重写版本调用基本版本并不是很有用;在Base中将其定义为undefined将给出相同的结果。

  1. 这是有道理的把它作为基本类型的对象,因为你不能调用派生那些只定义的函数,如果任何私有成员变量在这两个定义,它会使用基地的那些。

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

  3. 如果你使$ privattrib成员公开,行

    公共$ privattrib = “弼”;

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

+0

很酷,但你的#1答案与#3没有冲突吗?例如,如果这两个attribs现在都是公共的,并且我运行父方法,它将使用派生类的公共覆盖属性。因此,Base对象可以看到Derived成员的属性。 我只是挑剔嘿。 – Ilya 2010-08-20 08:43:01

+0

我不认为答案冲突,因为我小心地指定基本版本仅用于私有成员变量;如果成员变量是公开的,则通过指出您得到的不同行为来扩展这一点。 – 2010-08-20 12:57:36

0

看来,当你声明该属性为私人它不能被派生类覆盖。如果你声明它是公开的,它可以被覆盖并且被其他代码直接访问。我认为保护意味着它可以被覆盖,但不能从外部访问。