【问题标题】:PHP manual OOP visibility example - can someone explain itPHP 手动 OOP 可见性示例 - 有人可以解释一下吗
【发布时间】:2012-03-15 01:56:54
【问题描述】:

我在 PHP OOP 手册 http://www.php.net/manual/en/language.oop5.visibility.php 中看到了这一点,但我无法理解为什么输出不是:Foo::testPrivate Foo::testPublic

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 oop


【解决方案1】:

这都是关于变量/方法的可见性。

您会注意到在Bar 类中,方法testPrivate()private。这意味着只有它自己可以访问该方法。没有孩子。

所以当Foo 扩展Bar,然后要求运行test() 方法时,它会做两件事:

  1. 它覆盖了testPublic() 方法,因为它是公共的,Foo 有权用它自己的版本覆盖它。
  2. 它在Bar上调用test() (因为test()只存在于Bar()上)。

testPrivate()覆盖,并且是拥有test() 的类的一部分。因此,Bar::testPrivate 被打印出来。
testPublic() 覆盖,并且是继承类的一部分。因此,Foo::testPublic 被打印出来。

【讨论】:

  • 对。感谢@rockerest 的清晰解释。
  • 但是如果你在Foo:testPublicecho $this->testPrivate(),它会回显Foo::testPrivate。所以当从这个上下文中调用它时,它看起来被覆盖了。现在我很困惑!
  • @bfavaretto 请记住,$this 是一个动态变量,它引用了代码所在的类。因此,在处理 test() 时,$this 引用了 Bar 类的临时副本(给你Bar::testPrivate()),但Foo 类中的$this 将引用Foo 类(给你Foo::testPrivate())。
  • @rockerest 我做了一些进一步的研究,但仍然感到困惑。我知道它像您说的那样有效,但是您能否推荐一篇文章或文档,让我可以进一步了解 PHP 内部的继承是如何工作的?例如,使用反射,我找不到你提到的Bar 的临时副本的任何痕迹——get_class($this) 总是输出Foo
  • @bfavaretto 您的get_class() 电话在哪里?在Bar 里面?还是在Foo?最好问您自己的问题,包括您拥有的确切代码、您期望发生的事情以及实际发生的事情。另一方面,SO 上的某个地方可能已经存在关于此的问题。
【解决方案2】:

在某些情况下,很容易注意到您想要 Bar 类上的 private 方法,但您也想要 Foo类来访问它。
但是等等,它是公开的还是私有的?
protected 修饰符出现了。
当方法是私有时,只有类本身可以调用该方法。
当一个方法是public时,每个人都可以调用它,就像一个免费的聚会。
当一个方法被保护时,类本身可以调用它,并且继承这个方法的任何人(子)都可以将它作为他们自己的方法来调用。

【讨论】:

    【解决方案3】:

    几天前我发布了同样的问题......因为这种行为对我来说也不合逻辑。 $this 总是引用它使用的当前对象。在我看来,这样的例子应该抛出错误或警告或其他东西。因为在上面的示例中,您实际上是在访问私有成员 :SSS 应该无法访问!

    【讨论】:

    • 不是建设性的答案。你可以发表一些建设性的评论而不是咆哮。
    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2011-11-22
    • 2016-12-12
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多