Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和带有私有/公共变量的继承_Php_Inheritance - Fatal编程技术网

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的答案进一步指出了如果成员变量是公共的,您会得到不同的行为。