2017-06-02 37 views
1

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

这里是抛出的错误:

PHP Fatal error: Declaration of Square::getArea($length) must be compatible with 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()方法在开始时设置不同形状的属性,但我d想知道是否存在另一种方式,并允许我定义可变的参数列表。

在此先感谢。

+1

'我可以在开始时使用孩子的__construct()方法设置不同形状的属性,这真的是最好的办法 –

+0

但是你也可以在'getArea()'中使用'func_get_args()方法而不指定方法定义中的参数 –

+0

我不喜欢'func_get_args()'。我觉得它很脏。我会保持构造方式,因为你说这是最好的方法。感谢您的评论@MarkBaker – JazZ

回答

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方法没有任何属性。属性是类本身的保护属性。您在调用特定类的构造函数时设置这些属性。

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']; 
     } 
    } 

} 
+0

感谢您的回答。 – JazZ