类可以扩展类并实现接口

Pim*_*ger 91 php php-parse-error

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

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

class database{ //extends both mysqli and implements databaseInterface
 //etc.
}
Run Code Online (Sandbox Code Playgroud)

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

class database implements databaseInterface extends mysqli{ 
Run Code Online (Sandbox Code Playgroud)

导致致命错误:

Parse error: syntax error, unexpected T_EXTENDS, expecting '{' in *file* on line *line*

Sim*_*ann 160

反过来试试:

class database extends mysqli implements databaseInterface { ...}
Run Code Online (Sandbox Code Playgroud)

这应该工作.

  • 由于您只能继承一个类,并且可以实现任意数量的接口,因此它可能是一种语法糖.另外,请记住,如果您的子类实现了任何接口,那么它们也会显示在已实现方法的列表中.所以把它们放在那个顺序是有道理的. (12认同)

Mic*_*cki 17

是的,它可以.您只需要保留正确的订单.

class database extends mysqli implements databaseInterface { ... }
Run Code Online (Sandbox Code Playgroud)

而且,一个类可以实现多个接口.用逗号分隔'em.

但是,我觉得有必要警告你,扩展mysqli课程是一个非常糟糕的主意.继承本身可能是面向对象编程中最被高估和误用的概念.

相反,我建议使用mysqli方式(或PDO方式)执行db相关的东西.

另外,这是一个小问题,但命名惯例很重要.你的课程database看起来更加通用mysqli,因此它表明后者继承database而不是循环.

  • 首先,因为它不是你的.当mysqli家伙决定改变某些子类时,其行为也会发生变化.其次,继承用于SPECIALIZE,而不是具有额外功能的EXTEND.这是OOP中最容易被误解的东西.根据经验,我倾向于只扩展抽象类. (10认同)
  • 我熟悉适配器模式.我只是说,如果方法名称更改或已弃用,您仍需要在两种方案中更改代码.虽然我同意在这种情况下非多态方法更好,但我并不认为适配器会"免疫"改变. (2认同)
  • 您只需要更改适配器代码,而不是所有使用该代码的地方.使用组合,无论如何都可以提供兼容性层,而对于继承,您最多可以将其称为hack.并且,我认为,适配器将提供更好的免疫力. (2认同)

nul*_*ter 8

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

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

}
Run Code Online (Sandbox Code Playgroud)