PHP接口:指定参数列表,但不指定参数类型

时间:2011-04-20 20:25:05

标签: php interface parameters

我创建了一个名为iMapper的界面。我希望我的所有mappers文件都能实现该接口。

但每个映射器都会指定参数类型。

示例:

interface iMapper
{
    public function insert($obj);
    public function update($obj);
    public function delete($obj);
}
class CarMapper implements iMapper
{
    public function insert(Car $obj){}
    public function update(Car $obj){}
    public function delete(Car $obj){}
}

该代码会产生以下错误:

  

CarMapper :: insert()的声明必须与iMapper :: insert()

的声明兼容

他们是否可以使界面与CarMapper兼容? (我不想更改映射器。)

由于

4 个答案:

答案 0 :(得分:2)

“但每个映射器都会指定参数类型。” - 我不得不说无法做到。

必须实现接口。这是什么意思?所有实现类都必须能够使用带有未指定参数的方法 - 接口内部方法所需的参数。

在方法体内调用instanceof是一种出路,但它确实不是一个好方法。

了解策略模式,我打赌它可以解决您的问题 - http://sourcemaking.com/design_patterns/strategy/php

答案 1 :(得分:2)

更好:

interface iObject {}

class Car implements iObject

interface iMapper
{
    public function insert(iObject $obj);
    public function update(iObject $obj);
    public function delete(iObject $obj);
}
class CarMapper implements iMapper
{
    public function insert(Car $obj){}
    public function update(Car $obj){}
    public function delete(Car $obj){}
}

答案 2 :(得分:0)

interface iMapper
{
    public function insert(Car $obj);
    public function update(Car $obj);
    public function delete(Car $obj);
}
class CarMapper implements iMapper
{
    public function insert(Car $obj){}
    public function update(Car $obj){}
    public function delete(Car $obj){}
}

接口和类方法必须匹配!必须使用相同类型的提示。

答案 3 :(得分:0)

您的课程必须实现该界面。但它并没有让PHP抱怨。

您可以在方法中使用类型检查。

查看instanceof