PHP中带有变量参数列表的抽象方法

时间:2017-06-02 18:21:38

标签: php oop inheritance methods abstract

我在PHP中的OOP中遇到了一个问题。我试图实现一个抽象的父类方法,并且从子类中,我必须使用可变数量的参数。

这是抛出的错误:

  

PHP致命错误:Square :: getArea($ length)声明必须与Shape :: getArea()

兼容

班级:

abstract class Shape {
    abstract protected function getArea();
}

class Square extends Shape {

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

}

class Triangle extends Shape {

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

}

我可以使用孩子的__construct()方法在启动时设置不同形状的属性,但我想知道是否存在另一种方式,并允许我定义变量参数列表。

提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为使用__construct的想法是最好的方法。这是为了什么。您希望每个形状都不同,每个形状必须以不同方式计算面积。因此,多态性和OOP设计原则。

说“是”,总会有其他黑客攻击。我不推荐这种方法,但如果需要你可以使用它。基本上传入一个数组,其中包含您想要的部分的键并使用它们。

abstract class Shape {
    abstract protected function getArea($data = null); //Default to null incase it is not passed.
}

class Square extends Shape {

    public function getArea($data) //$data should have a length key
    {
        if(isset($data)){
            return pow($data['length'], 2);
        }
    }

}

class Triangle extends Shape {

    public function getArea($data) //$data should have a base and height key
    {
        if(isset($data)){
            return .5 * $data['base'] * $data['height'];
        }
    }

}

答案 1 :(得分:1)

正如您提到的问题中的评论一样,有几种方法可以解决您的问题。

类属性和构造函数 在我看来,这将是最简单的方法。它既简单又聪明。

interface Shape
{
    protected function getShape();
}

class Square implements Shape
{
    protected $length;

    public function __construct(int $length)
    {
        $this->length = $length;
    }

    protected function shape()
    {
        return pow($this->length, 2);
    }
}

class Triangle implements Shape
{
    protected $base;

    protected $height;

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

    protected function getShape()
    {
        return .5 * $this->base * $this->height;
    }
}

每个类都实现Shape接口。 getShape方法没有属性。属性是类本身的受保护属性。在调用特定类的构造函数时设置这些属性。