2011-06-01 41 views
6

我正在圍繞「static ::」關鍵字處理一些PHP,並遇到太多靜態調用導致混淆方法所在的問題。它更容易通過例子來說明:PHP中可能出現的PHP錯誤::在PHP 5.3.3中

class Class1 
{ 
    function Test() 
    { 
     return Class2::Test(); 
    } 
} 

class Class2 
{ 
    function Test() 
    { 
     return static::Test2(); 
    } 

    function Test2() 
    { 
     return true; 
    } 
} 

/* test 1: calling Class1::Test() statically results in expected call to Class2::Test2() */ 
echo "test 1: " . Class1::Test() . "\n"; 

/* test 2: instantiating the class causes Class1::Test2() to be called, which does not exist */ 
$Class1 = new Class1(); 
echo "test 2: " . $Class1->Test() . "\n"; 

我想伸手去讓PHP的專家誰可以告訴我是否這可能是一個真正的錯誤或語言的簡單濫用的意見。

我意識到所有的靜態調用都可能是奇怪的,但它代表了我遇到的實際代碼。

請讓我知道是否需要更多的信息或澄清。感謝您提前提供任何幫助!

+1

您使用的是哪個版本的PHP?靜態關鍵字沒有擴展到5.3 – 2011-06-01 19:26:49

+0

我想他是問,這是否真的是一個關於static關鍵字的錯誤,以及整個晚期靜態綁定事件是如何「假設」工作的。 – LLBBL 2011-06-01 19:28:47

+0

我忘了提及,運行5.3.3 – 2011-06-01 19:31:40

回答

7

late static bindings上的PHP文檔回答了您的問題。

「後期靜態綁定通過存儲最後一個」非轉發調用「中指定的類來工作。在靜態方法調用的情況下,這是明確命名的類(通常是左側的一個:運算符);在非靜態方法調用的情況下,它是對象的類別,「轉發呼叫」是由self ::,parent ::,static ::「引入的靜態方法」...

您的測試1是一個靜態調用,因此調用Class2::Test()時,它將存儲Class2。靜態test2調用指的是Class2中的正確位置。

您的測試2是非靜態調用,因此它在所有情況下都使用對象的類,並且由於它是Class1,因此它找不到方法Test2

+0

感謝您的參考,我可以看到他們在文檔中特別描述了這個實例。但是,現在我不得不懷疑這是否應該報告錯誤?思考? – 2011-06-01 19:39:41

+0

@Jeff它爲什麼會是一個錯誤?看起來這正是他們的意圖。你會期望什麼樣的行爲?爲什麼更正確? (你必須在錯誤報告中向他們解釋。) – Tesserex 2011-06-01 19:42:02

+0

首先,我並不像許多人那樣熟悉PHP內部工作。在我的示例中,代碼期望通過$ Class1-> Test() - > Class2 :: Test() - > Class2 :: Test2()獲得Class2 :: Test2()的結果。這是一個合理的期望嗎? – 2011-06-01 19:45:22