2012-04-11 60 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