我正在編寫我自己的日誌記錄類來保存數據庫中的數據。當我看CI如何做,我注意到有一個log_message()
函數處理日誌記錄。有一個load_class
函數我不能分配給CI用戶指南中的任何內容。Codeigniter:使用load_class
他們爲什麼要投入額外的功能呢?
什麼/在哪裏加載這個功能從文件嗎?
希望有一些CI傢伙怎麼能回答:-)
我正在編寫我自己的日誌記錄類來保存數據庫中的數據。當我看CI如何做,我注意到有一個log_message()
函數處理日誌記錄。有一個load_class
函數我不能分配給CI用戶指南中的任何內容。Codeigniter:使用load_class
他們爲什麼要投入額外的功能呢?
什麼/在哪裏加載這個功能從文件嗎?
希望有一些CI傢伙怎麼能回答:-)
簡短的回答: 你可以寫自己的日誌類重寫默認的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);
這將運行以下檢查順序:
/system/libraries
文件夾的「Log.php」文件/application/libraries
一個「MY_Log.php」文件(或任何你的子類前綴設置在您的配置)/system
文件夾),但你必須繼承類/application
下,裝載課呢。我其實從來不需要使用load_class()
功能,因爲它允許擴展相當的無縫連接。但是,瞭解它的工作原理是很好的。
因此,要覆蓋某個類,請首先找到原始位置(通常爲/system/libraries
或/system/core
)。把你的擴展文件放在相應的/application
文件夾中(這很重要!如果它在/system/core
之下,分機必須在/application/core
之下)。將文件名和類名前綴爲MY_
(或您在配置中設置的任何名稱),並將其擴展爲CI_
基類。
感謝您的簡短回答。很多很多謝謝你的答案!我認爲CI人不會使用它?!爲什麼不在用戶指南中?不管怎樣,現在我知道如何擴展日誌文件。它比建立一個新的庫文件好得多。 – suntrop 2012-01-08 12:31:04