抽象的私人功能

时间:2011-10-29 13:30:51

标签: php inheritance abstraction

以下代码将让PHP感到不满,即customMethod()是私有的。为什么会这样?可见性是由声明某事物而不是定义的地方决定的吗?

如果我想使customMethod仅对Template类中的样板代码可见并防止它被覆盖,我是否会将其保护并最终保留?

的template.php:

abstract class Template() {
    abstract private function customMethod();

    public function commonMethod() {
        $this->customMethod();
    }
}

CustomA.php:

class CustomA extends Template {
    private function customMethod() {
       blah...
    }
}

Main.php

...
$object = new CustomA();
$object->commonMethod();
..

4 个答案:

答案 0 :(得分:44)

抽象方法不能是私有的,因为根据定义它们必须由派生类实现。如果您不希望它为public,则需要protected,这意味着派生类可以看到它,但没有其他人可以看到。

The PHP manual on abstract classes向您展示了以这种方式使用protected的示例。

答案 1 :(得分:2)

抽象方法是公开的或受保护的。这是必须的。

答案 2 :(得分:1)

如果您担心customMethod课程之外会调出CustomA,则可以CustomA课程final

abstract class Template{
    abstract protected function customMethod();

    public function commonMethod() {
        $this->customMethod();
    }
}

final class CustomA extends Template {
    protected function customMethod() {

    }
}

答案 3 :(得分:0)

父类看不到PHP在子类中私有的任何内容。子类看不到父类中私有的任何内容。

请记住,在PHP中使用抽象方法时,可见性必须在子类与父类之间流动。在这种情况下,将可见性private与PHP配合使用将CustomA::customMethod完全封装在CustomA内部。您唯一的选择是publicprotected可见性。

由于您无法创建抽象类Template的实例,因此可以维护客户端代码的隐私。如果使用final关键字来防止将来的类扩展CustomA,那么您将找到解决方案。但是,如果必须扩展CustomA,则必须暂时了解PHP的运行方式。