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,"showSmarty"), $arr);
    }
}

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

问题解决了!!!

时间: 2024-08-29 05:36:49

PHP之回调函数传参(解决eval函数拼接对象参数的问题)的相关文章

JS基础之传参(值传递、对象传递)

一.概念 我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference).在计算机科学里,这个部分叫求值策略(Evaluation Strategy).它决定变量之间.函数调用时实参和形参之间值是如何传递的. 按值传递 VS. 按引用传递 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本.修改形参的值并不会影响实参. 按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再

Vue用router.push(传参)跳转页面,参数改变,跳转页面数据不刷新的解决办法

vue-router同路由$router.push不跳转一个简单解决方案 vue-router跳转一般是这么写: goPage(ParentDeptCode2,DeptCode2,hosName,hosId){ this.$router.push({ path:'/ChoiceTime', query:{ DeptCode:ParentDeptCode2, DeptCode2:DeptCode2, hosName:hosName, hosId:hosId } })} 但是当遇到,需要跳转同页面不

[Java]_函数传参的疑惑与思考

问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs. 1 void dfs(TreeNode node , int sum , ArrayList<Integer> curPath) 2 void dfs(TreeNode node , int sum , boolean ifExist) 问题:在1号中我可以在方法中修改curPath,在结束函数调用时,变量修改仍然生效.   在2号问题中,我即使在函数中修改了ifExist,结束函数调

关于函数传参--传指针,传引用

今天和同学讨论到指针和引用的传递问题,有些想法从推理上讲是正确的,但是因为是推理,说出自己观点的时候不是那么有底气,本着实践是检验真理的唯一标准的原则,在电脑上敲了几段代码,验证了推理的正确性. 先上代码,再分析. 代码1: void Swap0(int a1,int b1){ int temp; temp=a1; a1=b1; b1=temp; } void Swap1(int *a1,int *b1){ //交换地址 int *temp; temp=a1; a1=b1; b1=a1; } v

python函数传参是传值还是传引用?

首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. 引用传递(pass-

函数传参课后练习—JS学习笔记2015-6-7(第51天)

老师的课后作业练习,看代码(最贵价格那个没有实现): 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <title>J函数传参——商品价格计算</title> 6 </head> 7 8 <body> 9

数据类型回顾——函数传参之商品价格计算—JS学习笔记2015-6-6(第50天)

经常我们可以看到很多网站会有多个相同功能的模块,比如淘宝首页的轮播,比如新浪首页的tab切换: 那么可以看出这些地方在HTML结构上是类似的,所以我们可以考虑用一块功能代码去实现,而不同是仅仅是传递参数的不同: 例如: 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"

Date对象,封闭空间,函数传参和封装,获取非行间样式,字符串操作

一.Date对象 1. 获取 oDate.getFullYear() 获取年份 oDate.getMonth()+1  获取月份( 0-11)----->1-12 oDate.getDate()  获取日 1-31 oDate.getHours() 获取小时 oDate.getMinutes() 获取分 oDate.getSeconds() 获取秒 oDate.getMilliseconds();   //毫秒 oDate.getDay() 获取星期几 0-6     0:星期天 例:数码时钟

JavaScript,数组和函数传参 笔记

函数返回值 return  一个函数只有一种返回值 函数传参 可变参,不定参 arguments 提取行间样式 style 提取非行间样式currentstyle  不兼容   getComputedstyle可在不兼容浏览器中使用  在写程序的时候  可用if函数处理兼容问题 在提取非行间样式的时候,复合样式(如:border,backgrund)不可提取,单一样式( height,width)可提取 数组的使用 定义  var arr=[12,5,8,9] var arr=new Array