PHP:Interhited方法调用父类中的方法

时间:2015-03-10 15:07:11

标签: php oop inheritance

class Person {
    function foo() {
        // Code.
    }

    function bar() {
        $this->foo();
    }
}

class Pete extends Person {

}

在上面示例中从Person::foo()内调用Person::bar()时,调用发生在Person类中。因此,我可以提高Person::foo() private的可见度。

如您所知,当我扩展Person课程时,Person::foo()Person::bar()会由子课程Pete继承。因此,继承的方法Pete::bar()会调用Pete::foo()

我的问题

Pete::bar()开始,对Pete::foo()的调用是否来自a)父类或b)子类?

3 个答案:

答案 0 :(得分:2)

如果方法的可见性为private,则显式调用它的所有代码必须位于同一个类定义中。这几乎就是规则,仅此而已。通过继承的间接调用工作正常。

class Foo {
    private function bar() { }
    public function baz() { /* here be dragons */ }
}

class Child extends Foo { }

Child课程中,您可能不会撰写$this->bar()。它会失败。对于类barprivate方法为Foo,其他代码无法调用它。您可以随时随地调用baz,它是public,可以从其他代码调用。 无论baz内部做什么都不关心。如果baz在内部调用bar,那很好。其代码位于Foo,因此可以调用bar

答案 1 :(得分:1)

  

从Pete :: bar()内部,对Pete :: foo()的调用是否来自a)父类或b)子类?

都不是。从技术上讲,foo()类中不存在Pete。它存在于Person中,由Pete继承。无论如何,谁调用方法都是基于调用。

例如:

$person = new Person();
$person->foo(); // invocation by `Person` object
$pete = new Pete();
$pete->foo(); // invocation by `Pete` object
  

我试图确定方法可见性

如果您希望继承这些方法,则只能使用publicprotectedprivate方法不会被继承。我建议您阅读有关visibility的更多信息。

deceze's answer所述,您可以制作方法private并通过其他public方法访问它。

答案 2 :(得分:1)

如果您将其设为私有,则只能从人员

调用Person::foo
class Person {
    //Can only be called inside of Person
    private function foo() {
        // Code.
    }

    public function bar() {
        //can be called
        $this->foo();
    }
}

您仍然可以致电bar,因为它是公开的。 bar仍然可以访问foo,因为它是来自Person的方法。

您无法从foo致电Pete,因为它只在人物中可见。

class Pete extends Person {
    public function doSomething() {
        //Works because bar itself calls foo
        $this->bar();
    }
}

如果您想直接致电foo或覆盖Pete,则需要声明protected而不是private