php怎么实现动态传参数??? 本帖最后由 ic2y__ 于 2014-04-17 17:21:01 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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 没有查询设定空预定值达到预定设想,,谢谢斑竹解答。 关于<textarea>分行显示的问题 html文件解析问题 mysql> set sql_mode=""问题 调用函数时如果想使用函数的默认参数,是不是不填写参数就是使用默认的? [求助]关于Apache2.2的VirtualHost问题 从word中复制文字到编辑器时有太多额外的属性了,如何能复制的简单一点,但又可以复制别样式 程序员应该看看的文章!---网页设计的价格标准 怎样过滤去html中诸如<table>等的各种控制符? 新手求助!sos! @_@谢谢 有人研究过postfix吗??? 这JB代码到底想干嘛? 请问怎样把参数变成一串乱七八糟的字符??
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 没有查询设定空预定值
达到预定设想,,谢谢斑竹解答。