1

関数の存在を確認する際に問題が発生しました - function_exists() と method_exists() は知っていますが、探している機能を取得できません

$MM->Player->Play() のようなソケット接続を介して関数を渡します。その後、それらを評価し、ソケット接続を介して結果を返します。

関数をフィルター処理します ($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].');');

入力が文字列であるため、評価する必要があります。

4

2 に答える 2

6

のコンストラクターでこの方法を試してくださいSDBApplication

method_exists($this->Player, 'Play');
于 2012-04-12T09:42:53.387 に答える
2

function_exists()method_exists()は、このタイプのチェック用です。1 つ目は通常の関数用で、2 つ目は OOP 関数用です。

于 2012-04-11T19:10:53.330 に答える