PHP和带有私有/公共变量的继承
我有一个关于输出显示方式的问题PHP和带有私有/公共变量的继承,php,inheritance,Php,Inheritance,我有一个关于输出显示方式的问题 <?php class Base { private $privattrib = "Private Attribute1"; function GetAttrib() { echo $this->privattrib; } } class Derived extends Base { private $privattrib = "bute"; function GetAttrib()
<?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();
对于上面的代码,我有几个问题:
当我调用parent::GetAttrib()时,$this的值(在基的GetAttrib()方法中)现在是成为基对象还是仍然是派生对象
输出为“私有属性1”。如果$this引用了一个派生对象,那么显示不应该是“bute”吗,因为private属性在基类中被重写了
如果我将两个privaattrib都更改为public,则输出现在为“bute”。为什么会这样
似乎当您将属性声明为private时,它不能被派生类重写。如果将其声明为public,则其他代码可以覆盖并直接访问它。我认为protected意味着它可以被重写,但不能从外部访问。当您将属性声明为private时,它似乎不能被派生类重写。如果将其声明为public,则其他代码可以覆盖并直接访问它。我认为protected意味着它可以被重写,但不能从外部访问。注意,让被重写的GetAttrib版本调用基本版本不是很有用;将其保留在Base中未定义将得到相同的结果
将其视为Base类型的对象是有意义的,因为您不能调用仅在派生中定义的任何函数,并且如果在这两种类型中都定义了任何私有成员变量,它将使用来自Base的变量
没有;由于$privattrib是私有的,所以Base的版本和派生的版本是完全独立的
如果将$privattrib成员公开,则行
public$privattrib=“bute”
是对$privattrib的重新定义,而不是对新独立变量的声明。请注意,将GetAttrib的重写版本调用为基础版本不是很有用;将其保留在Base中未定义将得到相同的结果
将其视为Base类型的对象是有意义的,因为您不能调用仅在派生中定义的任何函数,并且如果在这两种类型中都定义了任何私有成员变量,它将使用来自Base的变量
没有;由于$privattrib是私有的,所以Base的版本和派生的版本是完全独立的
如果将$privattrib成员公开,则行
public$privattrib=“bute”
是对$privattrib的重新定义,而不是宣布一个新的独立变量。很酷,但你的#1答案与#3答案不冲突吗?例如,如果这两个属性现在都是公共的,并且我运行父方法,那么它将使用派生类的public重写属性。因此,基础对象可以看到派生成员的属性。我只是很挑剔,呵呵,我不认为答案有冲突,因为我很小心地指定基本版本只用于私有成员变量;3的答案进一步说明了这一点,指出了如果成员变量为public,则会出现不同的行为。很酷,但你的#1答案与#3答案不冲突吗?例如,如果这两个属性现在都是公共的,并且我运行父方法,那么它将使用派生类的public重写属性。因此,基础对象可以看到派生成员的属性。我只是很挑剔,呵呵,我不认为答案有冲突,因为我很小心地指定基本版本只用于私有成员变量;3的答案进一步指出了如果成员变量是公共的,您会得到不同的行为。