我在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()
方法在启动时设置不同形状的属性,但我想知道是否存在另一种方式,并允许我定义变量参数列表。
提前致谢。
答案 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方法没有属性。属性是类本身的受保护属性。在调用特定类的构造函数时设置这些属性。