7

当我浏览 GitHub 时,大多数项目都以这种方式在接口中定义方法:

interface ExampleInterface
{
    function getId();
}

我现在的问题是为什么在接口中定义方法可见性是不好的风格:

interface ExampleInterface
{
    public function getId();
}

它使接口更加严格,但这不是接口的用途吗?

4

5 回答 5

12

接口中的私有函数有什么意义?声明public是多余的。

来自 TFM:

All methods declared in an interface must be public, this is the nature of an interface.

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

于 2012-05-28T11:05:22.330 回答
5

这是因为接口是您对外部世界的某些功能的承诺。在上面的示例中,每当一个类实现一个接口时,它保证该类将提供一个调用getId外部世界的方法,而不管它是如何实现的。

因此,如果您创建一个 private promise,它是无关紧要的,因为没有人关心是否有一个具有某些功能的私有方法,无论如何其他人都无法访问它。

另一方面,接口中的所有方法本质上都是公共的(因为它们只不过是对外界的承诺),因此您明确提及它public是多余的。

于 2012-05-28T11:07:41.113 回答
2

接口只能包含公共方法,所以公共有点多余。

于 2012-05-28T11:05:56.607 回答
2

一个接口只能有公共成员,所以不需要声明它。而这些功能是要被继承的。所以; 接口中声明的所有方法都必须是公共的,这就是它的本质..

于 2012-05-28T11:09:09.390 回答
2

我可以理解私人不能工作但也受到保护?

我知道这是对外界的“承诺”,但如果某物实现了一个接口,该方法将保持受保护,因此仍然保持相同的“承诺”。它声明有函数 a、函数 b 以及受保护的函数 c,因此如果我不扩展/实现它,我们就可以从中派生出,那么我将无法访问函数 c。因为当你阅读课程时它的工作原理是一样的。

@AlphaMale 好的,那么界面的意义何在?它是用来为班级创建“食谱”的吗?因此,当您在代码中实际使用它时,它只会实现和强制方法。如果您的代码需要方法才能工作并且您不想将其强制用于特定类,这将变得很方便。

假设我要创建邮件程序,但我必须处理需要邮件的主要流程,但邮件程序将使用不同的方式来构建这些邮件。现在需要一个接收消息(任何类型)和电子邮件地址的基本发送函数,但由于这些类处于开放环境中,因此将此发送函数公开是很危险的,因此我们需要将其作为受保护的方法。现在在两个进程中有多个邮件程序,但每个进程共享相同的方法构造方法,所以有 2 个抽象类,但现在由于接口有限,您现在必须声明第三个抽象类来包含这个受保护的发送函数,以便它也可以扩展,否则您将拥有相同的受保护发送功能。如果一个新开发人员在一个全新的进程上工作并查看界面,那么发送函数将永远不会被强制执行。如果我们说可以在接口中声明受保护,那么在外部如果您检查某物是否是接口,它将与类一样工作,您仍然无法访问受保护的函数。

Private makes sense because then only the interface will know about these values and since an interface can't do anything this will be pointless.

于 2014-10-22T13:15:34.443 回答