【问题标题】:PHP: Set private, protected, public in interface?PHP:在界面中设置私有,受保护,公共?
【发布时间】:2012-06-02 18:11:16
【问题描述】:

当我浏览 GitHub 时,大多数项目都是这样在接口中定义方法的:

interface ExampleInterface
{
    function getId();
}

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

interface ExampleInterface
{
    public function getId();
}

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

【问题讨论】:

    标签: php interface coding-style


    【解决方案1】:

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

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

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

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

    Private 是有意义的,因为只有接口知道这些值,而且接口不能做任何事情,这将毫无意义。

    【讨论】:

      【解决方案2】:

      接口只能有公共成员,因此无需声明。这些函数是继承的。所以; 接口中声明的所有方法都必须是公共的,这就是它的本质..

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            接口中私有函数的意义何在?声明 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

            【讨论】:

            • 你一针见血——需要注意的是,如果要扩展实现接口的类和方法,protected 声明可能不是多余的供内部使用,但可能有不同的实现。但是 PHP 不会让你这样做,所以它有点学术。
            • 你应该使用抽象方法 @DaveRandom 而不是 Interface 来做到这一点。
            • @RogerRussel 抽象方法只能在 php 具有多重继承的情况下完成。因为情况并非如此,所以接口中的受保护方法会有很大帮助。
            • 我不再跟上 PHP,但似乎使用 trait 有助于解决这类问题,你可能比我更了解 Traits,但我使用它似乎很少我解决了。
            • 关于@DaveRandom 告诉我们的问题。我会用这样的方法解决它: abstract class SomeClass{ abstract protected function SomeFunction($foo, $boo); } 它将在哪里扩展此类以强制执行它。
            猜你喜欢
            • 1970-01-01
            • 2023-04-08
            • 2017-01-20
            • 2011-06-19
            • 2017-12-19
            • 1970-01-01
            • 2011-05-29
            • 2019-08-24
            • 2021-03-19
            相关资源
            最近更新 更多