我对输出的显示方式有疑问。
<?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;
因此,对于上面的代码,我有几个问题:
当我调用parent :: GetAttrib()时,$ this的值(在Base的GetAttrib()方法中)是否现在变为Base对象,还是仍然是Derived对象?
输出为“私有属性1”。如果$ this指的是Derived对象,那么显示应该不是“bute”,因为私有属性在基类中被覆盖了吗?
如果我将两个privaattrib更改为public,则输出现在为“bute”。这是为什么?
答案 0 :(得分:0)
似乎当您将属性声明为私有时,它不能被派生类覆盖。如果您将其声明为public,则可以覆盖它并由其他代码直接访问。我认为受保护意味着它可以被覆盖,但无法从外部访问。
答案 1 :(得分:0)
请注意,使用重写版本的GetAttrib调用基本版本并不是很有用;在Base中保留undefined将得到相同的结果。
将它视为Base类型的对象是有道理的,因为您不能调用仅在Derived中定义的任何函数,并且如果私有任何成员变量在两者中定义,它将使用那些来自Base。
没有;由于$ privattrib是私有的,Base的版本和Derived的版本是完全独立的。
如果您将$ privattrib成员公开,则行
public $ privattrib =“bute”;
是对$ privattrib的重新定义,而不是对新的独立变量的声明。