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)子类?
答案 0 :(得分:2)
如果方法的可见性为private
,则显式调用它的所有代码必须位于同一个类定义中。这几乎就是规则,仅此而已。通过继承的间接调用工作正常。
class Foo {
private function bar() { }
public function baz() { /* here be dragons */ }
}
class Child extends Foo { }
在Child
课程中,您可能不会撰写$this->bar()
。它会失败。对于类bar
,private
方法为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
我试图确定方法可见性
如果您希望继承这些方法,则只能使用public
或protected
。 private
方法不会被继承。我建议您阅读有关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
。