問題
前幾天遇到了這個問題,本地項(xiàng)目打不開了,百度發(fā)現(xiàn)是Thinkphp版本的問題,官方說把tp升級到最新版,可解決.
過程
百度搜索到[MarsWill]的文章(http://my.csdn.net/hayixia606),解釋了這個問題
在使用TP5框架的時候出現(xiàn)了如下的異常:
Uncaught Error: Call to undefined function lang() in framework/tpl/think_exception.tpl:82
這個異常的大概意思是在framework/tpl/think_exception.tpl這個文件中的lang()是一個未定義函數(shù)整葡。而think_exception.tpl就是tp用來顯示異常的試圖模板姆打。那為什么會報(bào)這個錯誤呢良姆?我在trace中查看了文件加載的順序,是這樣的:
因?yàn)榭蚣茉O(shè)計(jì)的加載順序是:
E:\mrwei\thinkfive\application\config.php ( 8.55 KB )
E:\mrwei\thinkfive\application\database.php ( 1.87 KB )
E:\mrwei\thinkfive\thinkphp\library\think\Hook.php ( 4.63 KB )
E:\mrwei\thinkfive\application\tags.php ( 0.96 KB )
E:\mrwei\thinkfive\application\common.php ( 0.60 KB )
E:\mrwei\thinkfive\thinkphp\library\think\Env.php ( 1.05 KB )
E:\mrwei\thinkfive\thinkphp\helper.php ( 17.22 KB )
E:\mrwei\thinkfive\thinkphp\library\think\Lang.php ( 6.72 KB )
E:\mrwei\thinkfive\thinkphp\library\think\Log.php ( 5.51 KB )
E:\mrwei\thinkfive\thinkphp\lang\zh-cn.php ( 3.78 KB )
也就是application的config.php是在Lang.php之前載入的幔戏,如果config.php中有錯誤的話錯誤處理模板中的>lang('xxx')函數(shù)會提示找不到lang()方法玛追。
解決方式
由于我本地是5.0.7版本的tp,到官網(wǎng)下載了5.0.14把其中thinkPHP文件夾替換掉,又出現(xiàn)了新的問題,不識別''__PUBLIC____",原來在view.php中默認(rèn)的并沒有定義public,將其中的構(gòu)造函數(shù)修改為以下
/**
* 構(gòu)造函數(shù)
* @access public
* @param array $engine 模板引擎參數(shù)
* @param array $replace 字符串替換參數(shù)
*/
public function __construct($engine = [], $replace = [])
{
// 初始化模板引擎
$this->engine((array) $engine);
// 基礎(chǔ)替換字符串
$request = Request::instance();
$base = $request->root();
$root = strpos($base, '.') ? ltrim(dirname($base), DS) : $base;
if ('' != $root) {
$root = '/' . ltrim($root, '/');
}
$baseReplace = [
'__ROOT__' => $root,
'__URL__' => $base . '/' . $request->module() . '/' . Loader::parseName($request->controller()),
'__STATIC__' => $root . '/static',
'__PUBLIC__' => $root.'/public',// 站點(diǎn)公共目錄
'__CSS__' => $root . '/public/css',
'__JS__' => $root . '/public/js',
'__IMG__' => $root.'/public/img',// 站點(diǎn)公共目錄
'__PLUG__' => $root.'/public/plugins',// 站點(diǎn)公共目錄
];
$this->replace = array_merge($baseReplace, (array) $replace);
}
結(jié)果還是報(bào)錯,遂開啟找茬模式,發(fā)現(xiàn)fetch函數(shù)也不一樣,修改之
/**
* 解析和獲取模板內(nèi)容 用于輸出
* @param string $template 模板文件名或者內(nèi)容
* @param array $vars 模板輸出變量
* @param array $replace 替換內(nèi)容
* @param array $config 模板參數(shù)
* @param bool $renderContent 是否渲染內(nèi)容
* @return string
* @throws Exception
*/
public function fetch($template = '', $vars = [], $replace = [], $config = [], $renderContent = false)
{
// 模板變量
$vars = array_merge(self::$var, $this->data, $vars);
// 頁面緩存
ob_start();
ob_implicit_flush(0);
// 渲染輸出
$method = $renderContent ? 'display' : 'fetch';
$this->engine->$method($template, $vars, $config);
// 獲取并清空緩存
$content = ob_get_clean();
// 內(nèi)容過濾標(biāo)簽
Hook::listen('view_filter', $content);
// 允許用戶自定義模板的字符串替換
$replace = array_merge($this->replace, $replace);
if (!empty($replace)) {
$content = strtr($content, $replace);
}
return $content;
}
終于搞定了