我正在编写自己的日志记录类,以便在数据库中保存数据。当我看到CI正在做什么时,我注意到有一个log_message()
函数来处理日志记录。我无法在CI用户指南中为任何内容分配load_class
函数。
1 他们为什么要把它放到额外的功能中?
2 此函数从哪个/哪里加载文件?
希望有一些CI家伙可以回答: - )
答案 0 :(得分: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);
按顺序执行以下检查:
/system/libraries
文件夹中的“Log.php”文件/application/libraries
是否有“MY_Log.php”文件(或者您的配置中设置的子类前缀)/system
文件夹),但你在/application
下有一个扩展类,那么也加载该类。我实际上从未需要使用load_class()
函数,因为它允许相当无缝地扩展。但是,知道它是如何工作的很好。
因此,要覆盖一个类,首先要找到原始文件所在的位置(通常为/system/libraries
或/system/core
)。将您的扩展文件放在相应的/application
文件夹中(这很重要!如果它在/system/core
下,则扩展名必须在/application/core
下)。使用MY_
(或您在配置中设置的任何内容)前缀文件名和类名,并使其扩展CI_
基类。