PHP的高级OOP功能的真实世界示例

Mat*_*ury 5 php oop

我正在努力提高我在PHP中的OOP知识,并一直在研究抽象类和接口.

我学到

  • 它们都是无法自己实例化的类,但可以扩展(在接口的情况下实现)
  • 抽象类为扩展它们的其他类提供方法和属性.
  • 如果类使用抽象方法,那么类本身也必须是抽象的.
  • 如果在抽象类中定义抽象方法,则所有子类都必须定义该方法的详细信息.未定义为抽象的方法可以与常规方法相同的方式使用.
  • 接口定义了实现它的类必须具有的方法.接口中未定义方法的功能,接口仅提供必须包含在子类中的方法列表.
  • 接口不定义任何属性.
  • 类可以实现任意数量的接口,但是它们必须为它们实现的每个接口定义一个方法

我认为这涵盖了基础知识.如果您认为我遗漏了任何内容,请随意添加.

我想知道的是,是否有任何实际的这些类的实现示例,尤其是接口类.有没有人知道任何使用它们的开源应用程序我可以浏览以更好地理解它们并查看它们在何时何地被有效使用?我遇到过使用动物的书籍例子,但未能证明这些类别的重要性.

Gor*_*don 1

命令模式并不是一个现实世界的例子,但您通常会遇到接口和抽象类的一种设计模式。请参阅链接以获取示例代码。

一般来说,“针对接口进行编程”被认为是良好的 OO 实践,因为它解耦了具体实现,让您可以更轻松地将它们更改为其他实现,例如,而不是要求特定的类

public function fn(ConcreteClass $obj)
{
    $obj->doSomething()
}
Run Code Online (Sandbox Code Playgroud)

你只要要求它提供一组特定的方法

public function fn(MyInterface $obj)
{
    $obj->doSomething()
}
Run Code Online (Sandbox Code Playgroud)

接口还有助于梳理大型继承结构。由于 PHP 仅支持单继承,因此您经常会看到如下所示的层次结构:

BaseClass -> Logger -> Auth -> User
Run Code Online (Sandbox Code Playgroud)

其中每个都包含这些类中使用的特定方面。有了界面,你只需要做

User implements Loggable, Authenticable
Run Code Online (Sandbox Code Playgroud)

然后通过策略模式或组合/聚合包含特定代码,这最终更易于维护。

有关 PHP 中预定义接口的列表,请参阅我的回答: