从A类的B类(扩展A类)调用静态方法

Mik*_*e B 5 php oop

在练习测试中有一个有趣的问题,我不明白答案.以下代码的输出是什么:

<?php
class Foo {
    public $name = 'Andrew';

    public function getName() {
        echo $this->name;
    }
}

class Bar extends Foo {
    public $name = 'John';

    public function getName() {
        Foo::getName();
    }
}

$a = new Bar;
$a->getName();
?>
Run Code Online (Sandbox Code Playgroud)

最初,我认为这会产生错误,因为静态方法不能引用$ this(至少在PHP5中).我自己测试了这个,它实际输出约翰.

我添加了Foo :: getName(); 在脚本的末尾,确实得到了我期待的错误.那么,当你从一个扩展你要调用的类的类中调用静态方法时会发生什么变化?

谁会介意详细解释这里发生了什么?

Pau*_*xon 7

Foo :: getName()使用较旧的PHP4样式的作用域解析运算符来允许调用重写的方法.

在PHP5中,您将使用parent :: getName()

如果您想扩展而不是完全覆盖基类的行为,这很有用,例如,这可能会使它更清晰

class Bar extends Foo {
    public $name = 'John';

    public function getName() {
        echo "My name is ";
        parent::getName();
    }
}
Run Code Online (Sandbox Code Playgroud)


Szy*_*zga 2

$this 到在其上下文中调用该方法的对象。所以:$this is $a->getName() is $a。$fooInstance->getName() 中的 $this 将是 $fooInstance。如果 $this 已设置(在对象 $a 的方法调用中)并且我们调用静态方法,则 $this 仍分配给 $a。

似乎使用此功能可能会产生很多混乱。:)