Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:在接口中设置私有、受保护、公共?_Php_Interface_Coding Style - Fatal编程技术网

PHP:在接口中设置私有、受保护、公共?

PHP:在接口中设置私有、受保护、公共?,php,interface,coding-style,Php,Interface,Coding Style,当我浏览GitHub时,大多数项目都是这样定义接口中的方法的: interface ExampleInterface { function getId(); } 我现在的问题是,为什么在界面中定义方法的可视性是不好的风格: interface ExampleInterface { public function getId(); } 它使接口更加严格,但这不是接口的用途吗?接口中的私有函数有什么意义?声明public是多余的 来自TFM: 接口中声明的所有方法都必须是公共的,

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

interface ExampleInterface
{
    function getId();
}
我现在的问题是,为什么在界面中定义方法的可视性是不好的风格:

interface ExampleInterface
{
    public function getId();
}

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

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

来自TFM:

接口中声明的所有方法都必须是公共的,这是接口的本质。


接口只能包含公共方法,因此公共方法有点冗余

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

因此,如果你做出一个私有的
承诺
,它是不相关的,因为没有人关心是否有一个具有某些功能的私有方法,它无论如何是其他人无法访问的


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

一个接口只能有公共成员,因此无需声明它。这些功能是继承的。因此,接口中声明的所有方法都必须是公共的,这是它的本质。

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

我理解这是对外部世界的一个“承诺”,但如果某个东西实现了一个接口,那么该方法将保持受保护状态,因此仍然保持相同的“承诺”。它指出有函数a、函数b和受保护的函数c,因此,如果我没有扩展/实现它,那么我就不能访问函数c。因为当你阅读课文时,它的作用是一样的

@好的,那么界面的意义是什么呢?它是用来为一个类创建“配方”的,对吗?因此,当您在代码中实际使用它时,它将只用于实现和强制方法。如果代码需要方法才能工作,并且您不想将其强制到特定的类,那么这就很方便了

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


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

你一针见血-需要注意的是,如果实现接口的类要扩展并且该方法用于内部使用,但可能有不同的实现。但PHP无论如何都不允许您这样做,所以这有点学术性。您应该使用抽象方法@DaveRandom而不是接口来完成此操作。@RogerRussel抽象方法只能在PHP具有多重继承的情况下完成。由于情况并非如此,在接口中使用受保护的方法会有很大帮助。我不再学习PHP,但似乎使用trait有助于解决此类问题,您可能比我更了解trait,但在我看来,使用trait的一小部分似乎就解决了。@DaveRandom告诉我们的问题。我会用这样的方法来解决它:抽象类SomeClass{abstract protected function SomeFunction($foo,$boo);}它会在这个类被扩展的地方执行它的实现。