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

问题描述 投票:0回答:3

我不明白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
3个回答
5
投票

如果您查看静态方法的定义,您将看到:

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

所以我们可以把这个论点作为PHP的借口。顺便说一句,在 C++ 中也是以同样的方式完成的。

但是还有其他语言,就像你说的那样。例如,在JAVA中,父方法的调用方式类似于

super.printMethod();
,在C#中,则类似于
base.printMethod()

因此,在 PHP 中,这样做可能是为了简化解析器,因为它们需要特定的边缘情况来进行此类调用

parent->printMethod()


2
投票

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

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

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

但你的例子不会


0
投票

这可以通过覆盖方法内部的

(new parent)
调用父方法来完成:

<?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";
        (new parent)->example();
    }
}

$b = new B;

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

上面的代码输出:

I am B::example() and provide additional functionality.<br />
I am A::example() and provide basic functionality.<br />
© www.soinside.com 2019 - 2024. All rights reserved.