Codeigniter:使用load_class

时间:2012-01-07 16:50:53

标签: codeigniter logging

我正在编写自己的日志记录类,以便在数据库中保存数据。当我看到CI正在做什么时,我注意到有一个log_message()函数来处理日志记录。我无法在CI用户指南中为任何内容分配load_class函数。

1 他们为什么要把它放到额外的功能中?

2 此函数从哪个/哪里加载文件?

希望有一些CI家伙可以回答: - )

1 个答案:

答案 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);

按顺序执行以下检查:

  1. 如果Log类已经存在,我们就完成了。返回单身人士。
  2. 如果没有,请首先检查/system/libraries文件夹中的“Log.php”文件
  3. 如果第2步没有文件,现在检查/application/libraries是否有“MY_Log.php”文件(或者您的配置中设置的子类前缀)
  4. 如果它加载了默认的CI类(来自/system文件夹),但你在/application下有一个扩展类,那么也加载该类。
  5. 返回该类的新实例(如果存在则为YOURS;否则为CI_ *类)
  6. 我实际上从未需要使用load_class()函数,因为它允许相当无缝地扩展。但是,知道它是如何工作的很好。

    因此,要覆盖一个类,首先要找到原始文件所在的位置(通常为/system/libraries/system/core)。将您的扩展文件放在相应的/application文件夹中(这很重要!如果它在/system/core下,则扩展名必须在/application/core下)。使用MY_(或您在配置中设置的任何内容)前缀文件名和类名,并使其扩展CI_基类。