在PHP OOP中调用子方法

时间:2016-09-13 15:31:53

标签: php inheritance

我正在创建一组用于测试某些数据的类 - 我有一个基类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()来解决这个问题。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

您应该使用抽象并使用其他名称。

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

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
    }
}