Php 为什么私有方法没有被覆盖
我试图执行官方php文档中的代码,但我不明白为什么privatePhp 为什么私有方法没有被覆盖,php,Php,我试图执行官方php文档中的代码,但我不明白为什么privateBar方法没有被Foo覆盖? class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private f
Bar
方法没有被Foo
覆盖?
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new Foo();
$myFoo->test();
打印
Bar::testPrivate Foo::testPublic
,但是为什么呢?在PHP中,只能覆盖public
和受保护的
方法。不能覆盖private
方法。在您可能使用的同一文档的注释中
如果您在扩展内存中重写私有方法时遇到问题
类,请阅读以下内容:)
手册上说,“私有限制了只对
定义项目”。这意味着扩展的儿童课程看不到
父类的私有方法,反之亦然
因此,家长和孩子可以有不同的实现
“相同”的私有方法,具体取决于调用它们的位置(例如。
父类或子类实例)。为什么?因为私有方法是
仅对定义它们的类和子类可见
看不到父级的私有方法。如果孩子看不到
父级的私有方法,子级不能重写它们。范围是
不一样。换句话说,每个类都有一组私有的
其他人无权访问的变量
演示私有方法在以下情况下的特殊性的示例:
扩展类:
输出将是“基本”
如果希望继承的方法在中使用重写的功能
扩展类,但公共类听起来太松散,请使用受保护的。那是
它的用途:)
按预期工作的样品:
输出将是“child”。
请参阅原始注释您不能覆盖私有方法,请使用
受保护
为此,请在问题标题中添加“PHP”,以帮助人们轻松找到您的问题。另外,请将“Overwrited”更改为“Overwrited”,因为这是一个众所周知的OOP术语。
<?php abstract class base {
public function inherited() {
$this->overridden();
}
private function overridden() {
echo 'base';
} }
class child extends base {
private function overridden() {
echo 'child';
} }
$test = new child(); $test->inherited(); ?>
<?php abstract class base {
public function inherited() {
$this->overridden();
}
protected function overridden() {
echo 'base';
} }
class child extends base {
protected function overridden() {
echo 'child';
} }
$test = new child(); $test->inherited(); ?> Output will be "child".