Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.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、传递方法和使用子对象';s属性而不是父属性';s的_Php_Oop_Inheritance_Methods - Fatal编程技术网

继承PHP、传递方法和使用子对象';s属性而不是父属性';s的

继承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

为什么传递给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->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。。。