在 PHP 中扩展抽象类时的方法可见性


Method visibility when extending an abstract class in PHP

在我的抽象类My_Class中,我有一个方法My_Class::foo()是从属于该类的另一个方法中调用的。例如:

abstract class My_Class {
    function foo() {
        // Stuff.
    }
    function bar() {
        $this->foo();
    }
    // More methods etc...
}

现在,我正在扩展我的抽象类。例如:

class My_Class_Extended extends My_Class {
}

如您所知,My_Class::foo()My_Class::bar()都由My_Class_Extended继承。

我从不希望My_Class::foo()My_ClassMy_Class_Extended之外被召唤,所以我知道不要让它的可见性public。我的问题是,我不确定是使其可见性protected还是private

我的问题

考虑到我在上述情况下如何称呼My_Class::foo(),它应该protected还是private?我不确定对My_Class::foo()的调用是来自子类还是父类。

提前谢谢。

单行:受保护,因为您希望子类具有访问权限


可见性修饰符的工作方式如下:

  • 公共:从任何地方都可以看到。
    • $c = new My_Class_Extended(); $c->thisIsPublic(); .这不适用于私有或受保护
  • 受保护:在类及其子类内部可见
    • 只能在属于派生自父类的类或父类本身的函数中调用这些函数。
  • private:仅对定义它的类可见。不能在子类中调用私有函数,也不能在类外部调用私有函数。

修饰符按包含顺序排序。因此,受保护比公共更严格,私有比受保护更严格。

您希望受到保护,因为您希望在子类内部调用它们,但不要在子类外部调用它们。


顺便说一句:在您的上下文中,abstract 关键字只能确保您无法从 My_Class 创建实例。