2012-01-07 43 views
0

我正在編寫我自己的日誌記錄類來保存數據庫中的數據。當我看CI如何做,我注意到有一個log_message()函數處理日誌記錄。有一個load_class函數我不能分配給CI用戶指南中的任何內容。Codeigniter:使用load_class

他們爲什麼要投入額外的功能呢?

什麼/在哪裏加載這個功能從文件嗎?

希望有一些CI傢伙怎麼能回答:-)

回答

2

簡短的回答: 你可以寫自己的日誌類重寫默認的CI類:

<?php 
// this file is /application/libraries/MY_Log.php 
class MY_Log extends CI_Log { 
    public function write_log($level = 'error', $msg, $php_error = FALSE) 
    { 
     // Put your own logging function in here. 
     // If you want it to still log to a file as usual, use this: 
     parent::write_log($level, $msg, $php_error); 
    } 
} 

龍答案:

load_class()功能基本上是單裝載機。如果該類已經被加載,則返回一個前一個實例;否則,加載它並創建單例。這在像CI這樣的框架中非常重要。你必須知道,每次你調用數據庫函數時,它都會將它應用到同一個對象上,而不是實例化一個新對象(這會變得非常混亂)。所有CI庫默認都以這種方式運行。

一個重要的注意:他們改變了這個功能如何在顯著2.0版本。以前,它只會從/libraries文件夾加載,但現在,它將從/core加載,或者在調用該函數時指定的任何位置加載。

這裏的進程加載,也就是說,登錄類(從你的例子):

$_log =& load_class('Log'); 
$_log->write_log($level, $message, $php_error); 

這將運行以下檢查順序:

  1. 如果日誌類已經存在,我們完成了。返回單身人士。
  2. 如果沒有,首先檢查/system/libraries文件夾的「Log.php」文件
  3. 如果沒有文件存在於第2步,現在檢查/application/libraries一個「MY_Log.php」文件(或任何你的子類前綴設置在您的配置)
  4. 如果加載默認的CI級(從/system文件夾),但你必須繼承類/application下,裝載課呢。
  5. 返回類的新實例(你的,如果它存在,否則,它是CI_ *類)

我其實從來不需要使用load_class()功能,因爲它允許擴展相當的無縫連接。但是,瞭解它的工作原理是很好的。

因此,要覆蓋某個類,請首先找到原始位置(通常爲/system/libraries/system/core)。把你的擴展文件放在相應的/application文件夾中(這很重要!如果它在/system/core之下,分機必須在/application/core之下)。將文件名和類名前綴爲MY_(或您在配置中設置的任何名稱),並將其擴展爲CI_基類。

+0

感謝您的簡短回答。很多很多謝謝你的答案!我認爲CI人不會使用它?!爲什麼不在用戶指南中?不管怎樣,現在我知道如何擴展日誌文件。它比建立一個新的庫文件好得多。 – suntrop 2012-01-08 12:31:04