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

PHP - Unable to implement the same interface twice

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

这是我的代码:

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() 的声明必须与 K:\xampp\htdocs\oop\Lec2\index 中的 b::baz(Baz $baz) 兼容。 php 第 26 行

您的 class d 错误地实现了 baz 方法。接口指定它必须采用类型提示 Baz 的参数,但您使用类型提示 Foo - 不允许从接口更改参数类型。 class d 中的修复将是:

<?php

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

函数的参数由接口指定,不得更改。

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

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

   public function baz(Foo $foo)
   {
   }

   public function baz(Baz $baz)
   {
   }
}

将导致

Fatal error: Cannot redeclare d::baz() in [...][...] on line XX

实现接口时,您必须按照声明的方式实现它。因此,由于 baz 是使用 Baz $baz 参数声明的,因此您 必须 使用相同的参数来实现它。

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

   public function baz(Baz $baz)
   {
   }
}