簡體   English   中英

parent :: method() - 調用非靜態方法

[英]parent::method() - calling non static method

我不理解在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

如果你看一下靜態方法定義,你會看到:

  1. 靜態方法旨在與類的所有實例相關,而不是與任何特定實例相關。 - 實際上這種方法與父類的所有子項相關。
  2. 即使尚未存在該類的實例,也可以調用靜態方法。 - 再次,您永遠不會創建父類的實例來調用該方法。

所以我們可以把這個論點作為PHP的借口。 順便說一句,在C ++中它以相同的方式完成。

但是還有其他語言,就像你說的那樣。 例如,在JAVA中 ,父方法稱為super.printMethod(); C#中 ,它就像base.printMethod()

因此在PHP中可能會為解析器的簡單性做好准備,因為對於這樣的調用parent->printMethod() ,它們需要特定的邊緣情況。

該通知意味着您不能將非靜態定義的方法稱為靜態,但您在方法內執行的調用不是靜態調用,而是對父類的調用。

所以這個調用將拋出E_STRICT警告:

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

但你的例子不會

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM