PHP 接口:指定任何可见性

Posted

技术标签:

【中文标题】PHP 接口:指定任何可见性【英文标题】:PHP Interface: Specify ANY visibility 【发布时间】:2012-10-05 14:10:33 【问题描述】:

我正在为一组类使用一个接口。但是我有一个问题,因为我希望在界面中允许任何visibility(即:publicprotectedprivate)。

我需要父方法只受保护,我需要子方法是私有的,但我收到错误提示

致命错误:接口方法 Baz::qux() 的访问类型必须在 中省略。"

我尝试在接口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();
    

【问题讨论】:

每当你似乎需要这样的东西时,这通常强烈表明你的概念有问题。 界面只是一个线框,所以为什么要关心它的可见性 我很抱歉,现在我知道了。谢谢大家的信息。 当您将方法指定为abstract 时,php 会引发相同的错误。例如:abstract public function qux(); 【参考方案1】:

您在Interfaces 中声明的方法应该是公开的。你定义一个带有接口的契约。任何非公共方法都是实现细节,不属于接口。顾名思义,实现细节应该进入具体的类实现接口。

来自***:

接口编程

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

【讨论】:

我有一个__call() 方法,该方法调用具有前缀的同名属性的受保护方法。访问$object->name 调用保护$object->getName()。在这种情况下,私有或受保护方法的接口可能有一些意义?我不确定。 @IvanMontilla 用于上述用途的接口没有意义,因为该接口旨在实现任何类的外部使用。如果您想以受保护方法的形式强制执行一致的继承行为,您可以使用带有抽象方法的抽象类,强制所有扩展该抽象类的类实现所述方法(只要这些类本身不是抽象的)。 (这也是 JvdBerg 对这个问题的answer 的意思。)【参考方案2】:

接口是两方之间的合同,是他们如何通信的协议。

将方法设置为受保护或私有是没有意义的,因为对方不会看到这些。

【讨论】:

“接口是一个契约”——说得够多了。 +1【参考方案3】:

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

【讨论】:

以上是关于PHP 接口:指定任何可见性的主要内容,如果未能解决你的问题,请参考以下文章

php 类常量可见性

PHP中默认类的可见性是啥?

Kotlin学习笔记之可见性修饰符

任何熟悉移动可见性和 zurbs 基础的人

Bazel Build: 规则可见性

PHP中抽象方法抽象类和接口的用法