【问题标题】:parent::method() - calling non static methodparent::method() - 调用非静态方法
【发布时间】:2016-10-07 08:53:18
【问题描述】:

我不明白在 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

【问题讨论】:

标签: php oop parent


【解决方案1】:

如果您查看definition of static method,您会看到:

  1. 静态方法意味着与类的所有实例相关,而不是与任何特定实例相关。 - 实际上,此方法与父类的所有子类相关。
  2. 即使该类的实例尚不存在,也可以调用静态方法。 - 同样,您永远不会创建父类的实例来调用该方法。

所以我们可以把这个论点作为 PHP 的借口。顺便说一句,在 C++ 中也是如此。

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

所以在 PHP 中,这可能是为了解析器的简单性,因为它们需要特定的边缘情况来进行这种调用 parent-&gt;printMethod()

【讨论】:

  • 现在我想知道父方法中的范围/上下文是什么,但这不在我问的问题范围内。是时候做一些实验了,如果我花时间的话……
【解决方案2】:

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

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

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

但你的例子不会

【讨论】:

  • 那为什么不写成parent-&gt;method()这样不是更有意义吗?这让我很困惑。
猜你喜欢
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2016-10-04
相关资源
最近更新 更多