zoukankan      html  css  js  c++  java
  • PHP之回调函数传参(解决eval函数拼接对象参数的问题)

    在使用Smarty时,定义了一个统一调用控制器的函数,如下:

    function C($name, $method){//控制器的名称和其中方法的名称
        require_once "controller/".$name."Controller.class.php";//引入控制器
        eval('$obj = new '.$name.'Controller();$obj->'.$method.'();');//实例化控制器并调用方法
    }

    但是该函数只能调用控制器中无参的函数,但是我想利用该函数传入参数,然后将参数传入控制器,改造如下

    function C($name, $method, $arr = []){
        require_once "controller/".$name."Controller.class.php";
        $params = implode(",", $arr);
        eval('$obj = new '.$name.'Controller();$obj->'.$method.'('.$params.');');
    }

    因为要考虑多个参数了问题,所有就把第三个参数设成数组类型,然会自动分割成"param1, param2, param3"的格式传入。

    现在问题来了,如果传入的是对象怎么办,系统无法把对象转成字符串使用,如果强行传入会报错,所有

     eval('$obj = new '.$name.'Controller();$obj->'.$method.'('.$params.');');

    的方式并没有什么卵用

    为了解决传入参数为对象的问题,想起了回调函数
    function C($name, $method, $arr = []){
        require_once "controller/".$name."Controller.class.php";
        $params = "";
        if(!is_object($arr)){
            $params = implode(",", $arr);
            eval('$obj = new '.$name.'Controller();$obj->'.$method.'('.$params.');');
        }else{
            eval('$obj = new '.$name.'Controller();');
            call_user_func(array($obj, $method), $arr); 
         }
    }

    先判断下传入的参数时不是对象,如果是,采用回调函数的方式调用,否则,按照之前的数组的方式调用。

    问题解决了!!!

  • 相关阅读:
    Linux环境下安装RabbitMQ
    JSONP和HttpClient的区别
    Oracle中如何写存储过程
    Oracle数据库操作---基础使用(二)
    Oracle数据库操作---入门(一)
    Java使用递归的方法进行冒泡排序
    Linux常用操作指令
    windows 下rust安装工具链 下载加速
    ubuntu 非lvm 模式 扩充根目录
    CRC16 脚本 python
  • 原文地址:https://www.cnblogs.com/caoruiy/p/4554366.html
Copyright © 2011-2022 走看看