Home >Backend Development >PHP Tutorial >php怎么实现动态传参数?

php怎么实现动态传参数?

WBOY
WBOYOriginal
2016-06-23 13:58:511315browse

先贴代码,代码精简了。

<?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 没有查询设定空预定值


达到预定设想,,谢谢斑竹解答。
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn