我是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-> getId()时,Base中的$ this是什么?
我很困惑,如果$ this指向d1实例,那么它应该能够访问私有$ id。但是,如果$ this指向$ d1内的Base,那么如何从Derived类获取$ id属性?谢谢!
所以我的问题是,当我制作$ d1-> getId()时,Base中的$ this是什么?
$this
是使用new
任何类的关键字创建的实例化对象的实例-不是类本身,而是该类的实例。在你的情况,因为你创造了$d1
与new Derived()
,$this
是派生的一个实例。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();
?>
受保护的可见性与与其一起继承的其他类共享。
但是,期望属性在派生类上存在是不好的做法。您不能保证派生类指定该属性。您可以考虑将基础定义为抽象并检查其存在。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句