调用PHP OOP中的子方法


Invoking child method in PHP OOP

我正在创建一组用于测试一些数据的类-我有一个基类Test:

class Test {
    protected $data;
    public function __construct($data) {
        $this->data = $data;
    }
    public function Run() {}
}
然后是一系列扩展了Test的类,如TestForX:
class TestForX extends Test { 
    public function Run() {
        // do test code
    }
}

我想给我的Run方法添加一些计时。我知道我可以在我的基类中添加startTimingendTiming的方法,并在我的扩展类中调用parent::startTiming()parent::endTiming(),但是我已经编写了大量的测试。

是否有可能扭转这一局面,并在我的基类中使用child::Run之类的东西?

class Test {
    public function Run() {
        $this->startTime = microtime(true);
        child::Run();
        $this->endTime = microtime(true);
    }
}

这将允许我通过在基类中包装方法来保持子类的整洁。目前,我通过为Test::Go调用$this->Run()的基类来绕过它。

如果您可以自由地更改对测试类的调用,您可以添加另一个函数来包装您的行为

public function runTest(){
    $this->startTime = microtime(true);
    $this->Test();
    $this->endTime = microtime(true);
}

我认为不可能调用与父方法同名的子方法。首先,假设子类覆盖方法是糟糕的设计。强制一个子类实现一个方法就是定义一个父类抽象方法,但是在这种情况下你不能这样做。Run()方法已经在父类中实现了。

您应该使用抽象并使用不同的名称。

这是一个可能适合你的实现。你可以把你的基类定义为一个抽象类,TestForX将扩展Test类,你将在TestForX的实例上调用Run()

abstract class Test {
    protected $data;
    abstract public function RunChild();
    public function __construct($data) {
        $this->data = $data;
    }
    public function Run() {
        $this->startTime = microtime(true);
        $this->RunChild();
        $this->endTime = microtime(true);
    }    
}
class TestForX extends Test { 
    public function RunChild() {
        // do test code
    }
}