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

时间:2015-03-10 12:19:30

标签: php oop

在我的抽象类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_Class之外调用My_Class_Extended,因此我知道不要使其可见public。我的问题是,我不确定是否要提高其可见度protectedprivate

我的问题

考虑到我在上述方案中如何调用My_Class::foo(),是应该protected还是private?我不确定对My_Class::foo()的调用是来自孩子还是父母。

提前致谢。

1 个答案:

答案 0 :(得分:0)

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


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

  • 公众:从各处可见。
    • $c = new My_Class_Extended(); $c->thisIsPublic();。这不适用于私人或受保护的
  • protected:在类中可见,它是子类
    • 您只能在属于从您的父类或父类本身派生的类的函数内部调用这些函数。
  • private:仅对其定义的类可见。您不能在子类中调用私有函数,也不能在类之外调用私有函数。

修饰符包含在内。因此受保护比公共受限制更严格,私有受限制比受保护更严格。

你想要受保护,因为你想在子类中调用它们,但不是在它之外。


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