Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.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 为什么扩展方法没有凌驾于父方法之上_Php_Class - Fatal编程技术网

Php 为什么扩展方法没有凌驾于父方法之上

Php 为什么扩展方法没有凌驾于父方法之上,php,class,Php,Class,我需要能够从父类运行子方法。 我正在调用子函数$this->getPlan,但它并没有调用子计划,而是只调用父计划。我认为一个扩展类超越了函数。 这是我的密码 class logon{ public function getPlan(){} public function __construct(){ } public function checkWorks(){ $this->getPlan(); } } class

我需要能够从父类运行子方法。 我正在调用子函数$this->getPlan,但它并没有调用子计划,而是只调用父计划。我认为一个扩展类超越了函数。 这是我的密码

class logon{
    public function getPlan(){}
    public function __construct(){
    }
    public function checkWorks(){
        $this->getPlan();       
    }
}

class plan extends logon{       
    function __construct(){
        parent::__construct();
    }
    public function getPlan(){
        echo "test";    
    }
}
$logon = new logon();
$plan = new plan();

$logon->checkWorks();
但是,如果我像这样从父构造函数调用代码,它将调用我的子方法

public function __construct(){
      $this->getPlan();
    }
我不想使用抽象类来实现这一点,因为这样做有很好的理由。
有人能告诉我为什么我的父方法没有被子类覆盖吗?

您正在调用logon方法:

$logon->checkWorks();
但是
logon
类中的
getPlan
为空。您需要调用子类(计划):


我用不同的方法解决了这个问题。 最初的问题是这个。我需要在计划中包括logon类,以便访问数据库。问题是登录需要在plan中运行一个方法,我不能包含plan类,因为那样会产生循环问题

我的解决方案已经走了一半,但我有一个合适的解决方案。通过使plan类成为子类,解决了不包括登录以访问数据库的问题,但我仍然可以在plan中调用方法。现在我没有在计划中包括登录,我可以在登录中包括解决了问题的计划,并且它可以工作。这是我的解决办法。现在我可以从这两个类访问我的方法。我知道只要我足够努力,我会找到办法的

class logon{
    public function __construct(){
    }
    public function checkWorks(){
        $p= new plan();
        $p->getPlan();
    }
}

class plan extends logon{

    public function __construct(){
        parent::__construct();
    }
    public function getPlan(){
        echo "test";    
    }
}

$logon = new logon();
$logon->checkWorks();

我知道我可以这样做,但我需要从我的登录类调用该方法。基本上,我需要的方法,以工作在两个类。您可以看到,当我登录时,我的登录类正在运行。我需要从主类调用子类中的一个方法,因为它执行某些检查。@ThomasWilliams-所以在登录类中定义getPlan。上面的代码不起作用,这种方式是不可能的。我意识到我可以做到这一点,但plan类拥有计划所需的所有方法。而logon拥有登录的所有方法。所以我不想在两个类中都放重复的方法。我的计划类使用登录类中的某些方法。“我的登录类只需要从plan类调用一个方法。@ThomasWilliams-您不需要在两个类中都添加冗余代码。仅在登录类中定义getPlan。或者更好,重构代码。您的应用程序逻辑可能不是很好。@ThomasWilliams-您应该添加真实代码或删除您的问题(或者批准我的答案)。因为你得到了答案,没有理由不能使用
$plan->checkWorks()。也许如果你加上你的真实代码,我们可以回答你的问题。
class logon{
    public function __construct(){
    }
    public function checkWorks(){
        $p= new plan();
        $p->getPlan();
    }
}

class plan extends logon{

    public function __construct(){
        parent::__construct();
    }
    public function getPlan(){
        echo "test";    
    }
}

$logon = new logon();
$logon->checkWorks();