子类声明必须与父类兼容

时间:2016-09-01 03:52:00

标签: php oop

我知道子类应该具有抽象父级的相同数据类型。但我没有宣布这样具体的事情。只是一个函数,子类确实声明了这个函数。所有其他子类都没有错误,但三角形没有错误。

abstract class Shape {
    abstract function getArea();
}

class Square extends Shape {
    protected $length = 4;

    public function getArea () {
        return pow($this->length, 2);
    }
}

class Circle extends Shape {
    protected $radius = 5;

    public function getArea() {
        return M_PI * pow($this->radius, 2);
    }
}

class Triangle extends Shape {
    protected $base = 3;
    protected $height = 14;

    public function getArea($base, $height) {
        return .5 * $this->base * $this->height;
    }
}

(new Triangle)->getArea();

为什么它会引发以下错误?

  

Triangle :: getArea()声明必须与Shape :: getArea()兼容。

1 个答案:

答案 0 :(得分:0)

您收到错误,因为您的方法的足迹已更改。它们应该在构造函数中传递,而不是在方法中传递参数:

class Triangle extends Shape {
    private $base;
    private $height;


    public function __construct($base, $height)
    {
        $this->base = (int) $base;
        $this->height = (int) $height;
    }

    public function getArea($base, $height) 
    {
        return 0.5 * $this->base * $this->height;
    }
}


$foo = new Triangle(4, 13);
echo $foo->getArea();

我还强烈建议您改变其他类,以便$radius$length等参数也在各自的构造函数中传递。否则,您目前正在打破开放式原则

enter image description here