PHP接口:指定任何可见性

36

我正在使用一组类的接口。然而,我希望接口中允许任何 可见性(即:public、protected 和 private)。

我需要父方法只能是 protected,并且我需要子方法是 private,但是我收到了以下错误:

Fatal error: Access type for interface method Baz::qux() must be omitted in <the file with Baz/Bar>."

我尝试在接口 Baz 中指定其他可见性方法并删除 public,但它们都失败了。

是否可以通过接口实现这一点?如果不行,那么是否可以声明为 abstract?我也尝试过这种方法,但失败了。

interface Baz
{
    public function qux();
}

class Bar implements Baz
{
    protected function qux()
    {
        //do foo
    }
}

class Foo extends Bar implements Baz
{
    private function qux()
    {
        parent::qux();
    }
}

3
每当你似乎需要这样一件事情时,这通常是你的概念出了问题的强烈指示。 - Niko
一个接口只是一个线框图,所以你为什么要在意它的可见性呢? - Ertunç
抱歉,现在我知道了。谢谢大家提供的信息。 - TheFrack
当您将方法指定为“abstract”时,PHP会引发相同的错误。例如:abstract public function qux(); - user133408
3个回答

59

接口中声明的方法应该是公共的。你通过接口定义了一个合同。任何非公共方法都是实现细节,不属于接口。顾名思义,实现细节应该放在实现接口的具体类中。

来自维基百科:

面向接口编程

使用接口可以使用一种称为“面向接口编程”的编程风格。其背后的想法是将编程逻辑基于所使用的对象的接口而不是内部实现细节。面向接口编程减少了对实现细节的依赖,并使代码更可重用。[7]它使程序员能够通过简单交换所使用的对象来更改系统的行为,这些对象实现了相同的接口。


1
我有一个__call()方法,它调用具有相同名称和前缀的属性的受保护方法。访问$object->name会调用受保护的$object->getName()。在这种情况下,私有或受保护方法的接口可能有一些意义?我不确定。 - Ivan Montilla
1
@IvanMontilla 为此使用创建一个接口是没有意义的,因为该接口旨在针对实现它的任何类的外部使用。如果您想以受保护方法的形式强制实现一致的继承行为,则可以使用抽象类和抽象方法,强制所有扩展该抽象类的类实现该方法(只要这些类本身不是抽象的)。 (这也是JvdBerg在他对此问题的回答中所说的意思。) - Michiel Bakker

18

接口是两个参与方之间的一个协议,规定它们之间的通信方式。

把方法设置为protected或private是没有意义的,因为另一方将看不到这些方法。


接口就是一个契约 - 话不多说。+1 - Geo

0

开发人员禁用了更流畅的重复使用的可见性。通过关键字implements,您已经将接口绑定到类上。无论如何,如果没有实现它,您无法访问接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接