【问题标题】:PHP&AJAX: How to call dynamically method with unknown number of argumentPHP&AJAX:如何使用未知数量的参数动态调用方法
【发布时间】:2012-07-25 13:15:57
【问题描述】:

我编写了通用类加载器,用于控制和加载 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请求中只发送一个参数时,JS代码包含:

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

什么时候不工作?当您需要发送超过 1 个参数时。我尝试使用 call_user_func_array(),但它不适用于 $this-> inside object,该方法必须是静态的。我尝试使用反射,但没有任何成功。

我知道一个地狱般的方法,如何做到这一点: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.')');

有谁认识你,怎么解决?

【问题讨论】:

  • 尝试重写你的问题,更多地关注当前的问题,而不是你的总体目标。仅发布导致问题的代码,在此处写下您从 PHP 或 JS 调试器获得的任何输出错误消息。仅仅说“它不起作用”是不够的信息,我知道你发布了一些代码,但我怀疑很多人理解你想要用它做什么。

标签: php ajax dynamic methods loading


【解决方案1】:

我不知道你试过什么没用,但这应该会成功替换你的eval()

call_user_func_array(array($oClass, $_POST["method"]), $params);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多