本帖最后由 ic2y__ 于 2014-04-17 17:21:01 编辑

解决方案 »

  1.   

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

  2.   

    哈哈,谢谢斑竹,发帖前测试一直不成功原来是因为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 没有查询设定空预定值
    达到预定设想,,谢谢斑竹解答。