我是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属性?谢谢!
答案 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作为可见性。
私有意味着您的属性只能在当前对象中访问,而父级和子级元素可以访问受保护的属性。