【问题标题】:Can a class extend both a class and implement an Interface一个类可以扩展一个类并实现一个接口吗
【发布时间】:2010-10-13 17:20:09
【问题描述】:

一个类可以在 PHP 中同时扩展一个接口和另一个类吗?
基本上我想这样做:

interface databaseInterface{
 public function query($q);
 public function escape($s);
 //more methods
}

class database{ //extends both mysqli and implements databaseInterface
 //etc.
}

如何做到这一点,只需这样做:

class database implements databaseInterface extends mysqli{ 

导致致命错误:

解析错误:语法错误,意外的 T_EXTENDS,在 *file* 行 *line* 中需要 '{'

【问题讨论】:

  • 这怎么太本地化了?! “这个问题不太可能帮助任何未来的访客”。然而,最佳答案有 33 个赞,问题 4 星!
  • @duality_ 186 个最佳答案、103 个问题和 18 颗星。你必须爱上 StackOverflow。

标签: php php-parse-error


【解决方案1】:

换个方式试试:

class database extends mysqli implements databaseInterface { ...}

这应该可行。

【讨论】:

  • 啊,非常感谢。为什么他们应该反过来?
  • 既然你只能继承一个类,你可以实现任意数量的接口,它可能是一个语法糖。另外,请记住,如果您的子类实现了任何接口,那也会出现在实现的方法列表中。所以把它们按这个顺序排列是有道理的。
  • 这是一种不好的做法吗?
【解决方案2】:

是的,它可以。您只需要保留正确的顺序即可。

class database extends mysqli implements databaseInterface { ... }

此外,一个类可以实现多个接口。只需用逗号分隔它们即可。

但是,我不得不警告您扩展 mysqli 类是非常糟糕的主意。继承本身可能是面向对象编程中最被高估和滥用的概念。

相反,我建议以 mysqli 方式(或 PDO 方式)来做与 db 相关的事情。

另外,这是一件小事,但命名约定确实很重要。你的类database 似乎比mysqli 更通用,因此它表明后者继承自database,而不是反过来。

【讨论】:

  • 为什么扩展 mysqli 类是个坏主意?
  • 首先,因为它不是你的。当 mysqli 人决定改变某些东西时,子类的行为也会改变。其次,继承是用来专门化的,而不是用额外的功能来扩展的。这是OOP中最容易被误解的事情。根据经验,我倾向于只扩展抽象类。
  • Michal - 对于使用多态方法与聚合/组合方法的开发人员来说,对 mysqli 的更改会有什么不同?你仍然需要更新你的代码来处理这些变化。
  • 我熟悉适配器模式。我只是说如果方法名称更改或被弃用,您仍然需要在这两种情况下更改代码。虽然我同意在这种情况下非多态方法更好,但我不相信适配器会“免疫”改变。
  • 您只需要更改适配器代码,而不是所有使用该代码的地方。使用组合,您无论如何都可以提供兼容性层,而使用继承,您充其量只能称其为 hack。而且,我的立场是正确的,适配器会提供更好的抗变化能力。
【解决方案3】:

是的,事实上如果你想实现多个接口,你可以这样做:

public class MyClass extends BaseClass implements myInterface1, myInterface2, myInterface3{ 

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2011-09-29
    • 2016-04-28
    相关资源
    最近更新 更多