2009-07-20 31 views
29

我想檢查一個函數存在於我創建的庫中,它是靜態的。我見過函數和method_exists,但還沒有找到一種方法可以讓我在相對上下文中調用它們。這裏有一個更好的例子:找出一個方法是否存在於一個靜態類

class myClass{ 
    function test1() 
    { 
     if(method_exists("myClass", "test1")) 
     { 
      echo "Hi"; 
     } 
    } 
    function test2() 
    { 
     if(method_exists($this, "test2")) 
     { 
      echo "Hi"; 
     } 
    } 
    function test3() 
    { 
     if(method_exists(self, "test3")) 
     { 
      echo "Hi"; 
     } 
    } 
} 
// Echos Hi 
myClass::test1(); 
// Trys to use 'self' as a string instead of a constant 
myClass::test3(); 
// Echos Hi 
$obj = new myClass; 
$obj->test2(); 

我需要能夠使測試3回聲嗨,如果函數存在,而不需要將其取出靜態文本。鑑於用於訪問類的關鍵字應該是'self',因爲$用於分配的類。

+0

爲什麼test1()方法不夠? – gapple 2009-07-21 00:19:06

+0

因爲我想把它放到一個將被多個類擴展的類中。我可以用一個魔術常數來實現這一點,但應該有一個更簡單的方法。 – 2009-07-21 00:31:53

回答

49

get_called_class()在PHP 5.3中引入,並且將返回 「後期靜態綁定」 類的名字:

class myClass{ 
    public static function test() 
    { 
     if(method_exists(get_called_class(), "test")) 
     { 
       echo get_called_class().'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // should print "subClass::test()" 

get_class()功能,如PHP 5.0.0不需要如果在一個類中調用任何參數,將返回聲明該函數的類的名稱(例如,父類):

class myClass{ 
    public static function test() 
    { 
     if(method_exists(get_class(), "test")) 
     { 
       echo get_class().'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // prints "myClass::test()" 

__CLASS__ magic constant也一樣[link]。

class myClass{ 
    public static function test() 
    { 
     if(method_exists(__CLASS__, "test")) 
     { 
       echo __CLASS__.'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // prints "myClass::test()" 
+0

謝謝!那正是我所期待的。 – 2009-07-21 01:11:06

+0

我正在尋找一種方法來檢查父類是否存在靜態方法,這個答案讓我發現'get_parent_class()'在沒有任何參數的情況下調用時的工作方式相同。謝謝! – mopo922 2016-05-04 05:10:43

1

更新:

啊,道歉。我暫時失明瞭:)你會想使用魔法常數__CLASS__

if (method_exists(__CLASS__, "test3")) { echo "Hi"; } 
+0

這個答案似乎與使用method_exists()的問題示例的test1()方法相同,類名稱作爲字符串傳遞 – gapple 2009-07-21 00:21:49

+0

這個想法是我不需要類名,因此我可以將該方法放入任何班級,並且它應該工作,無論班級是否已分配。 – 2009-07-21 00:27:38

+0

你的意思是說,我只是提出了主要問題? – 2009-07-21 00:35:55

相關問題