2013-08-01 31 views
1

我有兩類:自::()方法調用使用父類的方法,而不是所謂的

class JController{ 
    public static function getInstance() 
    { 
     //some source, not important... 
     self::createFile();// 
    } 

    public static function createFile() 
    { 
     // this is base class method 
    } 
} 

class CustomController extends JController{ 

    public static function createFile() 
    { 
     // this is overriden class method 
    } 
} 

,我試圖調用派生類的靜態方法,它調用的父母方法和未覆蓋。它預期的行爲?

這就是我嘗試使用它:

$controllerInstance = CustomController::getInstance(); 

我的問題是:在CustomController :: CREATEFILE爲什麼不CustomController ::的getInstance()調用()?

+0

可能重複http://stackoverflow.com/questions/13174343/overriding-static-methods-in -php) – Neal

+0

是的,它是一個重複的,沒有找到它.. – insanebits

回答

6

這是預期的行爲。在php 5.3之前,靜態方法只會調用層次結構中第一個定義的方法。 5.3+具有late static binding支持,並且可以直接在子類上使用該方法。要做到這一點,你需要使用static關鍵字,而不是self

public static function getInstance() 
    { 
     //some source, not important... 
     static::createFile();// 
    } 
的[在PHP重寫靜態方法(
+0

感謝您的答案,但也許有其他方式呢?因爲我最重要的課程是Joomla's,順便說一下你的答案是第一個,我會在幾分鐘內接受 – insanebits

+0

不是我沒有修改核心課程就能想到的。這就是說取決於createFile的邏輯,並且確切地說你想要的最終結果可能是另一種方式。 – prodigitalson

+0

我只需要調用我的靜態方法而不是基類中的一個,所以我已經複製了該方法的源代碼,並將'self'改爲'static',它的工作方式就像一個魅力:) – insanebits