2010-12-21 52 views
2

在php 5.3中使用這種靜態「繼承」有點麻煩我需要測試靜態類中是否存在靜態函數,但是我需要從父類靜態類中進行測試。需要幫助,使用php5.3靜態繼承

我知道在PHP 5.3我可以使用'靜態'關鍵字排序模擬'這個'關鍵字。 我只是無法找到一種方法來測試函數是否存在。

下面是一個例子:

// parent class 
class A{ 

// class B will be extending it and may or may not have 
// static function name 'func' 
// i need to test for it 

    public static function parse(array $a){ 
     if(function_exists(array(static, 'func'){ 
      static::func($a); 
     } 
    } 
} 

class B extends A { 
    public static function func(array $a){ 
     // does something 
    } 
} 

所以現在我需要執行B::parse(); 的想法是,如果子類有一個功能,它會被使用, 否則將無法使用。

我想:

function_exists(static::func){} 
isset(static::func){} 

這2不工作。

任何想法如何做到這一點? 順便說一下,我知道傳遞lambda函數作爲解決方法的可能性,在我的情況下,這不是 選項。

我有一種感覺,有一個非常簡單的解決方案,我現在無法想象。

現在我需要調用

回答

2

不能爲類和對象(方法),只有函數使用function_exists。您必須使用method_existsis_callableisset只適用於變量。另外,static不模擬$this,它們是兩個完全不同的東西。

話雖這麼說,在特定的情況下,你必須使用is_callable具有引用static關鍵字:

if (is_callable(array('static', 'func'))) { 
    static::func(); 
} 

或...

if (is_callable('static::func')) { 
    static::func(); 
} 
+0

is_callable(陣列( '靜',' func'))工作正常。我擔心如果'func'不存在,那麼is_callable可能會引發至少一個警告:變量沒有被定義,但它不會。如果func函數不存在,則返回false,這很好。 – Dmitri 2010-12-21 22:19:45