gpt4 book ai didi

php - 与界面交互?

转载 作者:可可西里 更新时间:2023-11-01 12:30:36 24 4
gpt4 key购买 nike

从我读到的内容来看,似乎可以与界面交互?

例如。假设我有一个带有空方法“eat()”的接口(interface)

然后2个子类正在实现这个接口(interface)。

我的 Controller 能否仅与界面交互并使用它的 eat() 方法?

看看这个链接中的图片strategy

最佳答案

除了访问其中定义的任何常量或将其用于 TypeHints 之外,您不能与接口(interface)交互。接口(interface)没有方法体。它们仅用于定义实现类必须遵守的契约。

interface Logger
{
const FOO = 1;
public function log($msg);
}

echo Logger::FOO; // 1
Logger::log($msg); // Fatal error: Cannot call abstract method Logger::log()
new Logger; // Fatal error: Cannot instantiate interface Logger

参见 http://php.net/manual/en/language.oop5.interfaces.php


针对接口(interface)编码与接口(interface)交互 基本上无非是调用 定义在 实现它们的类中的接口(interface)。您调用实现,而不是定义。该定义只是指定对于每个实现接口(interface)的类,必须有一个具有指定参数的特定方法。

考虑这些类:

Class DbLog implements Logger 
{
public function log($msg) { /* log $msg to database */ }
}

Class FileLog implements Logger
{
public function log($msg) { /* log $msg to file */ }
}

这两个类都实现了Logger,因此必须有一个方法log($msg)。你基本上是在说:“嘿,同学们,如果你想成为一名 Logger,请确保我可以对你调用 log()。”。现在在你的代码中的某处你可能有一个需要记录器的类,比如

class Foo
{
protected $logger;
public function __construct(Logger $logger)
{
$this->logger = $logger;
$this->logger->log('I can haz logger! Yay!');
}
}

Foo 不关心它是否获取 FileLogDbLog 或任何其他具体记录器。它只关心它得到任何它可以调用log() 的Logger。 Foo 甚至对 log() 做什么都不感兴趣。所有 Foo 关心的是能够调用 log()。不过,您并没有在界面中调用 log()。您在传递给 Foo 的具体类中调用它,但在 UML 图中,您会像在您链接的页面中显示的那样表示它,因为您只是针对接口(interface)进行编码.

这样做的主要优点是您的类的耦合度要低得多。您可以更轻松地交换依赖项,例如在单元测试中使用模拟时,您的代码将更易于维护。

基本上,将界面视为一种概念标准化。例如,当您购买新的 DVD 播放器时,您希望它有一个 按钮,以某种方式(您不关心如何,只是那样)使播放器播放 DVD。当您按下那个按钮时,您并不是在按下一般抽象的 DVD 接口(interface)规范,即 DVD 播放器必须有一个播放按钮,而是您点击了该品牌播放器上播放按钮的具体实现。

关于php - 与界面交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2697399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com