ThinkPHP報Class 'Core\Log' not found竟然是由這個原因導致的


項目在開發階段運行的好好的(Debug=true),上線后(Debug=false)其中有一個頁面報“對不起,您的頁面暫進無法找到!”錯誤。摸不清頭腦,看看了這個頁面也沒有什么兩樣,可就是提示這句話,也不知道是哪一步報錯了。最后用代碼中用全文檢索搜索這句話發現:

\ThinkPHP\Conf\convention.php

  /* 錯誤設置 */
    'ERROR_MESSAGE'         =>  '對不起,您的頁面暫進無法找到!',//錯誤顯示信息,非調試模式有效
    'ERROR_PAGE'            =>  '',    // 錯誤定向頁面
    'SHOW_ERROR_MSG'        =>  false,    // 顯示錯誤信息
    'TRACE_MAX_RECORD'      =>  100,    // 每個級別的錯誤信息 最大記錄數

由此可見出現此提示是因為這里配置了出錯后的提示語,再看到后面的一個配置  'SHOW_ERROR_MSG' => false, // 顯示錯誤信息 這里已配置不顯示錯誤信息,也就是說出任何錯誤都會提示"ERROR_MESSAGE"配置的內容,因此我們給配置為'SHOW_ERROR_MSG' => true,然后刪除runtime里面的內容,再刷新頁面,果然看到了錯誤提示:

Class 'Core\Log' not found

這個錯誤更麻煩,找了半天,首先出錯頁面沒有引用Core\Log,唯獨只有這一個頁面報錯,還是摸不清頭腦。最頭痛的是,一量把Debug=false或SHOW_PAGE_TRACE=true開啟頁面調試就不會有此錯誤,在網上也找不到類似的資料。沒辦法,一句代碼一句代碼的扣:

首先將出錯頁面的代碼全部刪除,只留一個Action,訪問此Action成功!

接着再把代碼全部恢復訪問此Action失敗!

目測其中有一個Action有問題,然后仔細查閱了一下代碼,跟其它頁面對比對比,找出最有可能出錯的一個方法,把這個方法注釋掉,再測試,訪問成功!

再恢復方法中的部分代碼再測試,訪問失敗!就這樣來回測試,最后定位到其中的一句代碼:

$_result_txt.= self::updateOrderExcel($_child[0], $_child[1], $_child[2],&$users,&$vars);

這句代碼只要存在就報錯。但這句代碼根本就沒執行,再細找最后發現:&$users,&$vars 這2個變量,如果把 & 去掉就好了。加上就不行。猜測的原因可能是這里代碼解析出錯了,然后調用寫日志又失敗了。結果就報這個錯。

這里寫 & 符號是因為我要傳遞變量的引用,在方法里賦值,因為返回值只有一個,而我要在方法外得到2個值,只能用引用的方式。

最后改成另一種寫法就好了,在調用的時候不加 & 符號,而在定義的時候加&符號,效果是一樣的。

什么意思呢?舉個例子:

function a($p1,$p2){
    $p2=333;  
    return   $p1+$p2;
}

a(22,&$p);
//原本寫法是這樣的 ,在這里調用完a后$p的值為333,沒錯,但正因為這樣寫就出現上述錯誤。
最后將寫法改為:
function a($p1,&$p2){
    $p2=333;  
    return   $p1+$p2;
}

a(22,$p);
//這樣調用完a后$p的值也是333,而解決了上述問題

 

至於什么原因,我也不清楚。在Debug=true時兩種寫法都OK,但Debug=false時第一種寫法就會報錯!也許第一種寫法是PHP新語法吧,目前網上的資料都是第二種寫法,我上次無意中發現第一種寫法也可行於是就用了第一種寫法,沒想到會出現這種錯誤,哎。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM