2013-06-01 88 views
1

我有一個類,我試圖創建一個函數,它將調用通過魔術方法運行的靜態方法。事情是職能的工作,只要他們是來自不同類型的類比類調用它們,但如果我調用同一類的靜態函數的所有函數將返回爲1關於魔術靜態函數的問題

class Test { 
    public function static __callStatic($name, $params) { 
     return 2; 
    } 
    public function __call($name, $params) { 
     return 1; 
    } 
    public function Test1() { 
     return Test::GetTwo(); 
    } 
} 
class Test2 { 
    public function Test() { 
     return Test::GetTwo(); 
    } 
} 
$t = new Test(); 
echo $t->Test1(); //prints 1 should be 2 
$t2 = new Test2(); 
echo $t->Test(); //prints 2 as it should 

即使靜態方法GetTwo()返回一個對象,如果我在與Test1()相同的範圍內調用一個函數,我仍會得到1。其他人遇到這個?

回答

1
echo Test::Test1(); 

您不需要(也不應該使用)實例來調用靜態方法。使用該類和範圍解析運算符(:)來完成該調用。

如果你需要使用late static bindingstatic::Test1();

對於一個方法調用的一個實例,PHP會嘗試以下操作:

  1. 查找名爲X.
  2. 查找魔術方法__call實例方法。
  3. 找到一個名爲X的類(靜態)方法。
  4. 找到一個魔術類(靜態)方法__callStatic。

在你的情況下,它會在步驟2找到__call並與之相符。

+0

看起來像這就是發生了什麼暫時我要把__call函數中的重定向運行__callStatic。認爲它會知道它試圖調用靜態,所以會首先嚐試__callStatic。 –

+0

看起來像到目前爲止的重定向工作,所以感謝指出PHP如何找到函數的順序,它幫助我找到解決方案,所以我會給你答案。 –

+0

我們使用self :: $變量來調用當前類的靜態。不,className :: $變量 –