【问题标题】:PHP interface: specify a parameter list, but not the parameter typePHP接口:指定参数列表,但不指定参数类型
【发布时间】:2011-04-20 20:25:04
【问题描述】:

我创建了一个名为iMapper 的接口。我希望我的所有映射器文件都实现该接口。

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

例子:

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 兼容? (我不想更改映射器。)

谢谢

【问题讨论】:

  • 我更新了我的答案 :)

标签: php interface parameters


【解决方案1】:

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

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

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

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

【讨论】:

  • 这对我来说听起来完全荒谬,但由于问题更多的是关于可行性而不是实际行为如何,我认为这是最好的答案。谢谢:)
【解决方案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){}
}

【讨论】:

  • 更好,以便接口方法iMapper的参数可以采用任何实现接口iObject的对象(不仅仅是对象Car)
  • 看起来很诱人,但它不会起作用,因为实现必须与声明的接口兼容。因此,它必须实现为 CarMapper::insert(iObject),而不是 CarMapper::insert(Car)。
【解决方案3】:
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){}
}

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

【讨论】:

  • 也许你是对的,但那段代码对我帮助不大。每个对象创建 1 个接口有什么意义?我希望 1 个接口被许多对象使用...
【解决方案4】:

你的类必须实现接口。但它并没有那么 PHP 抱怨。

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

看看instanceof

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2011-05-03
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多