【问题标题】:PHP can't extend from interface?PHP不能从接口扩展?
【发布时间】:2013-09-20 17:16:27
【问题描述】:

我在下面写在一个单独的 php 文件中。

<?php
interface people
{
    public function take($s);
}

class engineer extends people
{
    public function take($s){
        echo $s;
    }
}
?>

人是一个接口,工程师扩展了人。 但是当我运行这段代码时,错误:

Fatal error: Class engineer cannot extend from interface people in E:\php5\Mywwwroot\b.php on line 12

发生了什么事?我的 PHP 版本是 5.4。

【问题讨论】:

  • 类实现接口,而不是扩展它们。
  • PHP 使用 Java 的方法来防止钻石问题 - 请参阅 en.wikipedia.org/wiki/Multiple_inheritance - 因此使用 implements 关键字
  • 谢谢大家。骗我。
  • 顺便说一句,虽然您的问题在技术上已解决,但此示例可能更适合类继承而不是接口实现。也就是说,工程师是一种人,将承担一个人的大部分方法和功能,以及额外的、特定于工程师的方法。因此,您不是在实现接口,而是在扩展“人”类。不过,我当然不会将“人”作为抽象类或任何东西,因为您可能希望单独使用基类似乎是合理的。
  • @roast_soul 我的回复回答了你的问题吗?

标签: php inheritance interface


【解决方案1】:

实现接口和扩展类:

<?php
interface people
{
    public function take($s);
}

class engineer implements people
{
    public function take($s){
        echo $s;
    }
}
?>

【讨论】:

  • 伙计,有时候我觉得自己愚蠢。出于某种原因,PHP 错误并没有让我想到“哦,我写的是 extends 而不是 implements”。
  • @bishop 不,你不笨,错误信息很笨。他们所要做的就是花 2 秒时间思考最清晰的错误信息是什么,然后 bam,为全世界所有 PHP 程序员解决的问题。但相反,他们选择了一条错误消息,让人觉得该特定接口和试图扩展它的特定类不起作用,而不是任何类都不能扩展任何接口的基本思想。
【解决方案2】:

extends 用于扩展另一个类。

对于接口,你需要使用implements来代替。

(虽然一个接口可以extend另一个接口)

【讨论】:

  • 但是 A 类中的方法签名 m1(AInterface $obj) 甚至不能被 m1(BInterface $obj) 覆盖
  • “接口可以像类一样使用扩展操作符进行扩展。” php.net - interfaces
【解决方案3】:

取决于你想要什么,它可能是:

  • 类扩展类
  • 类实现接口
  • 接口扩展了一个接口

您只能扩展一个类/接口并实现多个接口。您可以将接口扩展到另一个接口,例如接口 DieselEngineInterface 扩展了 EngineInterface。

还想注释一下,既然你可以有类和接口层次结构,你需要知道什么时候使用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多