【问题标题】:Visibility in PHP? context of `$this` when inherited?PHP 中的可见性?继承时`$this`的上下文?
【发布时间】:2016-03-03 03:22:27
【问题描述】:

我是 php 新手,我正在阅读文档以了解可见性。我对文档中的这个例子有点困惑。 当调用 $myFoo->test() 时,不应该调用 Foos $this->testPrivate(); 。我的意思是 $this 不应该是 Foos 对象而不是 Bar 对象吗? .据我所知(我在这里可能是错的)Foo 将有自己的test() 方法,该方法继承自Bar,调用$myFoo->test() 将调用'$this->testPrivate',其中$this 应该是 Foos 对象 myFoo。那么怎么调用BartestPrivate方法呢?

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 inheritance class-visibility


【解决方案1】:

test()Bar 中,将调用Bar 有权访问的最高级别方法。它可以访问Foo'stestPublic(因为它是public)所以它可以调用它,但是它不能访问Foo'stestPrivate()(因为它是privateFoo)所以它称它为自己的testPrivate()

【讨论】:

  • ...但即使使用class Foo [...] public function testPrivate() Bar::testPrivate() 也会被调用 ;-)
  • 是的,但是$this 如何改变它的上下文。我仍然很困惑,不应该相反吗,因为 Foo 可以访问 test(),因为它在 class Bar 中是公开的。所以 Foo 有自己的继承自 Bar 的测试方法?
  • 即使 php 开始在实例/作用域上查找方法,在这种情况下 context 仍然是 Bar,而不是 Foo。您可以通过删除 Bar::testPrivate 来测试它。错误消息将是Call to private method Foo::testPrivate() from context 'Bar'。为什么Bar::testPrivate 甚至在公共Foo::testPrivate 下也被调用我只能通过链接到处理程序代码来解释(现在;我目前是一个有这种网络成瘾的濒危物种......):github.com/php/php-src/blob/PHP-5.6.16/Zend/…
猜你喜欢
  • 2012-10-14
  • 2020-01-22
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2012-11-30
  • 1970-01-01
  • 2016-07-30
相关资源
最近更新 更多