2012-04-11 79 views
1

我有一個問題,檢查IA功能的存在 - 我知道function_exists()和method_exists(),但不能得到的功能我找檢查是否函數存在

我通過像$ MM-套接字連接傳遞函數>播放器 - >播放()。 之後,我評估他們並通過套接字連接返回結果。

我過濾功能(必須以$ MM開頭,其他任何將被拒絕), ,但我不能讓我的代碼來檢查功能是否存在。這很重要,因爲如果該函數不存在,服務器將崩潰 。

任何人都知道這個解決方案?

在此先感謝。

代碼:

$MM = new SDBApplication;

在SDBApplication的構造函數:

$this->Player = new SDBPlayer;

我嘗試以下方法來檢查: 代碼:

method_exists($MM, "Player::Play"); function_exist("$MM->Player->Play);

都返回false即使函數存在

解決方案

$parts = explode('->', $string); 
$numParts = count($parts)-1; 
$object = '$MM'; 
for($i=0; $i < $numParts; $i++){ 
    $object .= '->'.$parts[$i]; 
} 
$parts[$numParts+1] = preg_replace('(\\(.*\\))', '', $parts[$numParts]); 
eval('$check = method_exists('.$object.', '.$parts[$numParts+1].');'); 

它需要eval'd因爲輸入是一個字符串。

+5

,你能告訴我們你的代碼和錯誤? – 2012-04-11 19:06:59

+0

這是越來越晚了,所以我會做的第一件事tomorow – 2012-04-11 20:45:29

+0

@DavidChan添加了代碼 – 2012-04-12 09:05:34

回答

6

各地嘗試這種方式在你的SDBApplication構造

method_exists($this->Player, 'Play'); 
+1

這確實有用。爲了讓輸入分裂,我將不得不使用爆炸。 但是我想知道如果有人輸入類似'$ MM-> DoesNotExists-> Play()',它會給我正確的結果。當我回家時我會測試它。 – 2012-04-12 10:18:50

+0

就個人而言,如果你的類完全依賴於現有的方法,如果它不存在或者拋出錯誤,我會從構造函數返回false。 – BenOfTheNorth 2012-04-12 10:22:28

+0

這不是關於正在加載的類,而是關於過濾用戶輸入以便服務器不會崩潰。但我得到它的工作,看到原來的文章 – 2012-04-12 11:31:55

2

function_exists()method_exists()是用於這種類型的檢查。首先是常規功能,其次是OOP功能。

+0

是的,但他們是,但我不能得到它的工作。 – 2012-04-12 10:18:23