PHP中的“继承”

时间:2016-09-04 16:18:24

标签: php inheritance

我是PHP新手,有两个问题。当我尝试以下代码时:

<?php
class Base{
    public function getId(){
        return $this->id;
    }
};


class Derived extends Base{
   public $id = 1;

   public function id(){
       return $this->id;
   }

};


$d1 = new Derived();

echo $d1->id();//echo 1
echo $d1->getId();//echo 1
?>

上面的代码会回显两个1。

但是,当我尝试以下代码时:

<?php
class Base{
    public function getId(){
        return $this->id;
    }
};


class Derived extends Base{
    private $id = 1;
    public function id(){
        return $this->id;
    }
};

$d1 = new Derived();

echo $d1->id();//echo 1
echo $d1->getId();//Cannot access private property Derived::$id
?>

第二个函数调用将给出一个错误“无法访问私有属性Derived :: $ id”。所以我的问题是,当我创建$ d1-&gt; getId()时,在Base中提到的$ this是什么?

我很困惑,如果$ this引用d1实例,那么它应该能够访问私有$ id。但是,如果$ this引用$ d1中的Base,那么它如何从Derived类获取$ id属性?谢谢!

3 个答案:

答案 0 :(得分:3)

  

所以我的问题是我做的时候在Base中提到的$ this   $ D1-&GT;?的getId()

$this是使用任何类的new关键字创建的实例化对象的实例 - 它不是类本身,它是实例该课程。在您的情况下,由于您使用$d1创建了new Derived(),因此$this是Derived的实例。 Base无法访问Derived的私有属性,因为基本私有属性独占到定义它们的类。它们不与继承的类共享。

  

如何从Derived类中获取$ id属性?

您正在寻找受保护的可见性:

<?php
class Base{
    public function getId(){
        return $this->id;
    }
};


class Derived extends Base{
    protected $id = 1;
    public function id(){
        return $this->id;
    }
};

$d1 = new Derived();

echo $d1->id();
echo $d1->getId();
?>

受保护的可见性与其他继承的类共享。

然而期望某个属性存在于派生类中是不好的做法。您无法保证派生类指定该属性。您可以考虑将基数定义为抽象并检查其存在。

答案 1 :(得分:1)

private修饰符表示只能从该类中访问class属性。任何子类或超类都将无法访问该属性。

在您的示例中,$ id对于Derived类是私有的,因此Base类无法访问它。

答案 2 :(得分:-1)

使用protected而不是private作为可见性。

私有意味着您的属性只能在当前对象中访问,而父级和子级元素可以访问受保护的属性。