我正在尝试从官方php文档执行代码,但我无法理解为什么私有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
,但为什么?
答案 0 :(得分:1)
在同一文档的评论中,您可以使用
如果您在扩展中覆盖私有方法时遇到问题 上课,读这个:)
手册说“私人限制仅对该类别的可见性 定义项目“。这意味着扩展的子类没有看到 父类的私有方法,反之亦然。
因此,父母和孩子可以有不同的实现 “相同的”私人方法,取决于你称之为的地方(例如 父或子类实例)。为什么?因为私有方法是 仅对定义它们的类和子类具有可见性 没有看到父母的私人方法。如果孩子没有看到 父母的私人方法,孩子不能覆盖他们。范围是 不同。换句话说 - 每个班级都有一套私人私人 没有其他人可以访问的变量。
展示私人方法的时间性的样本 扩展课程:
<?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".
请参阅Php docs了解原始评论
答案 1 :(得分:0)
在PHP中,只有public
和protected
方法可以被覆盖。不是private
个。