子方法声明必须与父方法

时间:2017-07-03 15:34:17

标签: php

这是我的代码:

我有一个类A,方法foo,它返回一个Bar对象。

class A {
    public function foo(): Bar {
        //some ops
        return $bar; //'Bar' object
    }
}

我还有一个类B,它使用重写方法A扩展类foo,返回BarX个对象。

class B extends A {
    public function foo(): BarX {
        //some ops
        return $barX; //'BarX' object
    }
}

重要的是 BarX类扩展了Bar

当我运行我的代码时,我在课程B上出错,说:

  

B::foo(): BarX声明必须与A::foo(): Bar

兼容

BarX延伸Bar后,它们的兼容性如何?我怎么能解决这个问题呢?

谢谢。

3 个答案:

答案 0 :(得分:2)

让Bar和BarX都实现一个接口,并在你返回类型时使用它。

<?php 

interface BarInterface(){ }

class Bar implements BarInterface(){ }

class BarX implements BarInterface(){ }

class A {
    public function foo(): BarInterface {
        //some ops
        return $bar; //'Bar' object
    }
}

class B extends A {
    public function foo(): BarInterface {
        //some ops
        return $barX; //'BarX' object
    }
}

答案 1 :(得分:1)

你可以返回一个BarX,但由于B扩展了A,它必须返回相同的类型,但由于BarX是Bar,你可以这样做:

class B extends A {
    public function foo(): Bar {
        $barX = new BarX;
        //some ops
        return $barX; //'BarX' object
    }
}

答案 2 :(得分:1)

仔细研究L中的SOLID并考虑:

function (A $a) {
    $bar = $a->foo();
}

$barBar还是BarX?你不知道。由于$a可以作为AB注明(因为B instanceof A,因为B extends A),因此您无法预测$a将是$bar将是什么。

这就是为什么统一且可预测的界面很重要,这就是PHP抱怨的原因。