路由闭包在非调试模式下出错

浏览:861 发布日期:2015/11/09 分类:求助交流 关键字: 闭包 路由
我在配置文件中对规则路由做了如下的闭包处理:'login/by/:method'                => // 通过某种方式登录
                function ($method){
                    $_SERVER['PATH_INFO'] = 'User/loginBy'.$method.'.html';
                    return false;
                },
在调试模式下一切正常,但是在非调试模式下,生成的common~runtime.php文件中,就变成了'login/by/:method' => Closure::__set_state(array( ))请问要如何解决这一问题?


问题原因是闭包函数使用var_export无法正确输出造成的,在网上找了下,只找到单独输出闭包函数的代码closure_dump($e),对其做了些修改,并且针对数组做了一点判断封装,写了custom_var_export($e)函数:/**
 * 将闭包函数转为字符串
 * @param Closure $c
 * @param boolen $escape
 * @return string
 */
function closure_dump(Closure $c, $escape = true) {
    $str = 'function (';
    $r = new ReflectionFunction($c);
    $params = array();
    foreach($r->getParameters() as $p) {
        $s = '';
        if($p->isArray()) {
            $s .= 'array ';
        } else if($p->getClass()) {
            $s .= $p->getClass()->name . ' ';
        }
        if($p->isPassedByReference()){
            $s .= '&';
        }
        $s .= '$' . $p->name;
        if($p->isOptional()) {
            $s .= ' = ' . var_export($p->getDefaultValue(), TRUE);
        }
        $params []= $s;
    }
    $str .= implode(', ', $params);
    $str .= '){' . PHP_EOL;
    $lines = file($r->getFileName());
    for($l = $r->getStartLine(); $l < $r->getEndLine(); $l++) {
        $str .= $lines[$l];
    }
    if($escape){
        $str = preg_replace('/[\r\n\t]/', '', $str);
    }
    $str = preg_replace('/}[,;]$/', '}', $str);
    return $str;
}
/**
 * 将变量转为输出到字符串
 * @param mixed $expression
 * @param boolen $escape
 * @return string 
 */
function custom_var_export($expression, $escape = true){
    $str = '';
    if(is_array($expression)){
        $str .= 'array(';
        foreach ($expression as $key => $val){
            $str .= "'".$key."' => ".custom_var_export($val).',';
        }
        $str .= ')';
    }else if($expression instanceof \Closure){
        $str .= closure_dump($expression);
    }else{
        $str .= var_export($expression, true);
    }
    return $str;
}
接着把Think.class.php大约92行的var_export(C(),true)替换成custom_var_export(C(),true),貌似是能够解决这一问题了,只是不知道是否造成了其他问题。
最佳答案
评论( 相关
后面还有条评论,点击查看>>