Maison >développement back-end >tutoriel php >php怎么实现动态传参数?

php怎么实现动态传参数?

WBOY
WBOYoriginal
2016-06-23 13:58:511312parcourir

先贴代码,代码精简了。

<?php class Cache{	public function get()	{			$invoker			= debug_backtrace();			$invoker_class		= $invoker[1]["class"];			$invoker_function	= $invoker[1]["function"]."_redirect";			$argus				= func_get_args();		        $invoker_class		= str_replace("Action","", $invoker_class);					D($invoker_class)->$invoker_function($argus);	}}?>

描述:
程序是在ThinkPHP开发,目的是把Cache的get方法接收的参数转发到指定的方法上,
最后一行:其中D方法是ThinkPHP自带的方法用的是单例模式。如果不加参数$argus是可以正常调用的。

问题:
现在想传递参数,比如get("name","age"),完整的传递到 D($invoker_class)->$invoker_function(“name”,"age")上,有什么办法。

call_user_func 看起来像是可以,不过看不出来怎么用。

求解。


回复讨论(解决方案)

call_user_func_array(array(D($invoker_class), $invoker_function), $argus);

call_user_func_array(array(D($invoker_class), $invoker_function), $argus);


哈哈,谢谢斑竹,发帖前测试一直不成功原来是因为call_user_func_array的第二个参数必须使用数组,如果不使用数组就会没有任何反映。。

最后完整的代码如下::代码烂,见谅。。
CacheModel.class.php    Cache模型文件
<?php/** * Cache 模型,在一次HTTP请求生存周期中有效的Cache,一次请求结束,Cache就清除。都在内存中 * 应用场景如下:程序某个地方读取了全部的产品种类名称和id,在另一处也读取了全部的产品种类和id,这样会造成重复数据库查询和变量的空间分配 * 构造缘由:起初准备把Cache分散在每个具体的模型里,发现这样做不好控制.不如集中控制 * @author  caoyuanye * */class CacheModel extends  Model{	var $cache_arr;	/**	 * 	 * 每个模型的最小化的方法里使用	 * @param $pk	 */	public function get()	{		$invoker			= debug_backtrace();		$invoker_class		= $invoker[1]["class"];		$invoker_function	= $invoker[1]["function"];		$argus				= func_get_args();		$str 				= $this->caculate($argus);		$base_str			= md5($str);		if($this->cache_arr[$invoker_class][$invoker_function]["key"] == $base_str)		{			echo "命中cache 没有查询";			//命中cache			return $this->cache_arr[$invoker_class][$invoker_function]["value"];		}				$new_invoker_class		= str_replace("Model","", $invoker_class);		$new_invoker_function	= $invoker_function."_setCache";				$rs = call_user_func_array(array(D($new_invoker_class), $new_invoker_function), $argus);		$this->cache_arr[$invoker_class][$invoker_function]["key"] = $base_str;		$this->cache_arr[$invoker_class][$invoker_function]["value"] = $rs;		return $rs;	}	/**	 * 	 * 递归计算所有的参数,判定参数是否发生改变	 */	private function caculate(&$argus)	{		$str = "";		foreach ($argus as $key => $value)		{			if(is_array($value))			{				$str .= $this->caculate($argus[$key]);			}else{				$str .= $value;			}		}		return $str;	}	}?>


测试模型
TestModel.class.php
<?php/** * 测试模型 * @author  caoyuanye * */class TestModel extends Model{	var $cache;	function __construct()	{		//D方法单例模式,不用操心		$this->cache = D("Cache");	}		public function run($a,$b,$c)	{		return $this->cache->get($a,$b,$c);		}			public function run_setCache($a,$b,$c)	{		return "设定3参数预定值<br />";	}			public function run2()	{		return $this->cache->get();	}	public function run2_setCache()	{		return "设定空预定值<br />";	}}?>


测试用例 
TestAction.class.php
<?php/** * 测试类,专门用来测试各种类 */class TestAction extends BaseAction{		public function test_function()	{		$test = D("Test");		echo $test->run("a","b","c");		echo $test->run("a","b","c");		echo $test->run("a","b","c");						$test2 = D("Test");		echo $test2->run("a","b","c");		echo $test2->run2();		echo $test2->run2();		echo $test2->run2();	}}?>



测试结果:
设定3参数预定值命中cache 没有查询设定3参数预定值命中cache 没有查询设定3参数预定值命中cache 没有查询设定3参数预定值设定空预定值命中cache 没有查询设定空预定值命中cache 没有查询设定空预定值


达到预定设想,,谢谢斑竹解答。
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn