【问题标题】:PHP inheritance weird use of $this operatorPHP 继承奇怪使用 $this 运算符
【发布时间】:2013-06-02 13:01:34
【问题描述】:

我有一个小问题。在 PHP 手册网站上有一个例子:

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

谁能用简单的方式解释为什么在一个示例中引用 $this 指向父方法(私有方法)而在另一个示例中指向子类中定义的当前方法(公共)? 这对我来说不合逻辑,我希望它在 both 情况下都指向子类方法,或者在这两种情况下都指向父方法?

请帮忙!

【问题讨论】:

  • 我猜你没有粘贴第二个例子
  • 因为testPrivate 在子类中被覆盖,而$myFoo 对象无法访问Bar 类中的testPrivate
  • 这两种方法都被覆盖了!?这对我来说还不清楚......

标签: php inheritance this extends


【解决方案1】:

这是因为子类只能访问父类的方法,如果它是publicprotected,而不是private。所以它诉诸自己的私有方法。

如果您总是想调用当前类的方法,请使用self:: 而不是$this->

【讨论】:

  • hmmm.... operator self:: 是用于常量和静态成员的类运算符。我仍然不清楚,因为我希望访问子类中的两个重写方法。它从超类获得私有,从子类获得公共。也许这是正确的行为?谁知道
  • self:: 也可以用于方法。试试看!
  • 我玩了一下,我认为这是因为范围。将#this# 与私有#member#(函数或属性)结合使用并被继承的方法仍然被视为SUPERclass 的成员并且无法访问SUBclasses 的私有成员!另一方面,它可以访问公共和受保护的成员。因为它可以访问子类的私有成员,所以它仍然指向超类中的私有成员......类似的东西。如果我使用 self:: 总是向超类发展!
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 2015-06-27
  • 2011-07-08
  • 2023-04-02
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多