【问题标题】:PHP - Unable to implement the same interface twicePHP - 无法两次实现相同的接口
【发布时间】:2017-01-22 15:24:39
【问题描述】:

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

这是我的代码:

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) 兼容

【问题讨论】:

    标签: php oop interface extends


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢@Erik 我明白了。
    【解决方案2】:

    这不是 Java,你不能(很遗憾)重载方法。所以,最后有类似的东西

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

    会导致

    致命错误:无法在 [...][...]XX

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

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

    【讨论】:

    • 我很感激。它帮助了@Nordenheim
    猜你喜欢
    • 2011-07-26
    • 2013-11-23
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多