2016-10-07 55 views
4

我不明白在PHP中調用父級方法的概念。 父方法不是靜態的,但它被靜態調用 - 通常PHP會拋出錯誤/警告。parent :: method() - 調用非靜態方法

問題是,這是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

+0

提問/回答類似的內容:http://stackoverflow.com/a/18738707/5542121 – user5542121

+0

另一個有趣的一個:http://stackoverflow.com/q/11165429/5542121 – user5542121

回答

3

如果你會看definition of static method您將看到:

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

所以我們可以拿這個參數作爲藉口PHP。順便說一下,在C++它是以同樣的方式完成的。

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

所以在PHP它可能做了解析器簡單,因爲他們將需要這樣調用parent->printMethod()特定的邊緣情況。

+0

現在我想知道父級方法中的範圍/上下文是什麼,但這超出了我所問的問題。一些實驗的時間,如果我只花時間... – user5542121

1

這意味着通知你不能調用非靜態定義的方法,靜態的,但你的方法裏面做了呼叫不是一個靜態的電話,但父類的調用。

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

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

,但你的這個例子也不會

+1

那爲什麼不是這樣寫的'父 - > method()'不會更有意義嗎?它令我困惑。 – user5542121