0

PHPクラスの制御とロード(「自動ロード」)などに使用する一般的なクラスローダーを作成しました。簡素化されたコードの一部:

PHP ファイル:

 namespace Ajax;

 require_once '../Loader.php';

 class Loader extends \Loader{

 static public function getAjaxResponse($Post){

    if (!\Checker::isClassName($Post['className']) || !\Checker::isMethodName($Post['method']) ){
        return '';
    }

    Loader::loadClass($Post['className']);
    $class = '\\'.$Post['className'];

    $handler = array($class, $Post['method']);
    if (is_callable($handler) ){
        $oClass = new $class(true);
        return $oClass->$Post['method']($Post['params']);
    }        
   }
 }

 new Loader;
 echo Loader::getAjaxResponse($_POST);

JS ファイル:

 var requestData = {
   className : 'Menu',
   method : 'assignItemToMenu',
   params : { IdItem: $('input[name="IdItem"]').val(), IdParent:$('select[name="IdParent"]').val() }
 };

 if ($('#itemsSortOrder').children().length == 0){
  $.extend(requestData.params, {addButtons : true} );
 }

 $.post('../classRepository/Ajax/Loader.php?open=' + $_GET['open'], requestData)
    .success(function(data){
       document.write(data);
       window.alert(data);
    })
    .error(function(){
       window.alert('Retrieving data failed.');
    });

いつ機能しますか?AJAX リクエストでパラメータを 1 つだけ送信すると、JS コードには次のものが含まれます。

 var requestData = {
   className : 'Vocabulary',
   method : 'getReport',
   params : $('#report').val()
 };

うまくいかないときは?複数のパラメーターを送信する必要がある場合。call_user_func_array() を使用しようとしましたが、オブジェクト内の $this-> では機能しません。メソッドは静的でなければなりません。リフレクションを使用しようとしましたが、成功しませんでした。

私は地獄の方法を知っています、これを行う方法: eval(); しかし、これは eval よりも悪い :)) 、コードは次のようになります。

 $params = array();
 foreach ($_POST['params'] as $param){
    if (is_string($param) ){
       $params[] = '"'.$param.'"';
    }
    else{
       $params[] = $param;
    }
 }
 $params = implode(',',$params);

 $oClass = new $class;
 eval ('$oClass->$_POST["method"]('.$params.')');

誰かあなたのことを知っていますか、それを解決する方法はありますか?

4

1 に答える 1

0

何を試してもうまくいかなかったのかわかりませんが、これでうまくいくはずeval()です:

call_user_func_array(array($oClass, $_POST["method"]), $params);
于 2012-07-26T21:42:08.623 に答える