parent :: method() - 调用非静态方法

时间:2016-10-07 08:53:19

标签: php oop parent

我不理解在PHP中调用父方法的概念。 父方法不是静态的,但它是静态调用的 - 通常PHP会抛出错误/警告。

问题是,这是来自PHP的怪癖,还是它应该如何在OOP中?

以php.net为例:

<?php
class A {
    function example() {
        echo "I am A::example() and provide basic functionality.<br />\n";
    }
}

class B extends A {
    function example() {
        echo "I am B::example() and provide additional functionality.<br />\n";
        parent::example();
    }
}

$b = new B;

// This will call B::example(), which will in turn call A::example().
$b->example();
?>

http://php.net/manual/en/keyword.parent.php

  

在PHP 5中,静态调用非静态方法会生成E_STRICT   等级警告。

http://php.net/manual/en/language.oop5.static.php

2 个答案:

答案 0 :(得分:3)

如果你看一下definition of static method,你会看到:

  1. 静态方法与所有类的实例相关,而不是与任何特定实例相关。 - 实际上此方法与父类的所有子项相关。
  2. 即使没有该类的实例,也可以调用静态方法。 - 再次,您永远不会创建父类的实例来调用该方法。
  3. 所以我们可以把这个论点作为 PHP 的借口。顺便说一句,在 C ++ 中,它的完成方式相同。

    但是还有其他语言,就像你说的那样。例如,在 JAVA 中,名为super.printMethod();的父方法,在 C#中,就像base.printMethod()一样。

    所以在 PHP 中,可能会为解析器的简单性做好准备,因为它们需要一个特定的边缘情况来进行这样的调用parent->printMethod()

答案 1 :(得分:1)

该通知意味着您不能将非静态定义的方法称为静态,但您在方法中执行的调用不是静态调用,而是对父类的调用。

所以这个调用会抛出E_STRICT警告:

$b = new B;
$b::example();

但你的例子不会