继承PHP、传递方法和使用子对象';s属性而不是父属性';s的
为什么传递给Professeur的父方法getHC()引用父方法的$this->quota(EnSignant)而不是子方法的$this->quota继承PHP、传递方法和使用子对象';s属性而不是父属性';s的,php,oop,inheritance,methods,Php,Oop,Inheritance,Methods,为什么传递给Professeur的父方法getHC()引用父方法的$this->quota(EnSignant)而不是子方法的$this->quota abstract class Enseignant { private $quota; //empty public function __construct($nom, $nbHeures)[...] public function getHC(){ return $this->nbHeures - $this
abstract class Enseignant {
private $quota; //empty
public function __construct($nom, $nbHeures)[...]
public function getHC(){
return $this->nbHeures - $this->quota; //Ici le problème
}
abstract protected function setQuota($q);
}
我需要$this->nbHeures->$this->配额才能传递给教授
class Professeur extends Enseignant {
const QUOTA = 192;
public function __construct($nom, $nbHeures) {
parent::__construct($nom, $nbHeures);
$this->setQuota(self::QUOTA);
}
protected function setQuota($q) {
$this->quota = $q;
}
}
并使用Professeur的配额,而不是Enseignant的配额。我发现您的示例代码存在两个问题:
Professeur
课程不扩展Enseignant
课程。我不确定这是否只是您在示例代码中复制的一个输入错误-但是第二个类应该声明为:
class Professeur extends Enseignant {
$quota
成员变量在父类中声明为private。这意味着子类无法访问该值,而子类中的setQuota()
函数正在子类上设置具有相同名称的新(未声明)变量
要解决此问题,应将$quota
变量声明为protected
,而不是private
protected $quota;
abstract class Enseignant {
protected $quota; // declare as protected so it can be
// accessed and modified from the child class
public function __construct($nom, $nbHeures) {
$this->nbHeures = $nbHeures;
}
public function getHC() {
return $this->nbHeures - $this->quota;
}
abstract protected function setQuota($q);
}
class Professeur extends Enseignant {
const QUOTA = 192;
public function __construct($nom, $nbHeures) {
parent::__construct($nom, $nbHeures);
$this->setQuota(self::QUOTA);
}
protected function setQuota($q) {
$this->quota = $q;
}
}
$e = new Professeur("Charles", 292);
echo $e->getHC(); // returns 100 now
另一种解决方案是将
$quota
变量保留为private,并使setQuota()
方法成为父类的一部分-仍然从子构造函数调用它。修复了这个问题,它被扩展了。正在查找$quota。那么如何使用正确的$quota?我把它改成了protected,但它不起作用。我已经更新了你的示例,并将其改写为我认为你在寻找的内容。这有用吗?可爱而详细+1!$e=新教授(“查尔斯”,292);echo$e->getHC();应该给我100而不是292。。。