PHP - 无法两次实现相同的接口

时间:2016-09-14 18:04:29

标签: php oop interface extends

我正在尝试实现两次接口扩展另一个接口,但无法弄清楚为什么我会收到致命错误

这是我的代码:

interface a {
    public function foo();
}

interface b extends a {
    public function baz(Baz $baz);
}

// This will work
class c implements b {
    public function foo() {
    }

    public function baz(Baz $baz) {
    }
}

// This will not work and result in a fatal error
class d implements b {
    public function foo() {
    }

    public function baz(Foo $foo) {
    }
}

我收到此错误消息:

致命错误:d :: baz()的声明必须与第26行的K:\ xampp \ htdocs \ oop \ Lec 2 \ index.php中的b :: baz(Baz $ baz)兼容< /强>

2 个答案:

答案 0 :(得分:6)

您的班级d错误地实施了baz方法。接口指定它必须使用typehint Baz接受参数,但是您使用typehint Foo - 不允许从接口更改参数类型。 D类中的修复将是:

<?php

class d implements b
{
   public function foo() {}
   public function baz(Baz $foo) {}
}

函数的args由接口指定,可能不会改变。

答案 1 :(得分:1)

这不是Java,你不能(不幸的是)重载方法。所以,最后有类似

的东西
class d implements b
{
   public function foo()
   {
   }

   public function baz(Foo $foo)
   {
   }

   public function baz(Baz $baz)
   {
   }
}

将导致

  

致命错误:无法在行 XX < [...] 中重新声明d :: baz() / p>

实现界面时,必须以与声明相同的方式实现它。因此,由于baz使用Baz $baz参数声明,因此必须使用相同的参数实现它。

class d implements b
{
   public function foo()
   {
   }

   public function baz(Baz $baz)
   {
   }
}