'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),貌似是能够解决这一问题了,只是不知道是否造成了其他问题。 最佳答案