创建核心系统类

优质
小牛编辑
140浏览
2023-12-01

每次CodeIgniter运行时都有很多基础类作为核心框架的一部分被自动初始化.但你也可以使用经过你修改的类来替换甚至扩展这些原始的核心系统类.

大多数用户一般不会有这种需求,但对于那些想较大幅度的改变CodeIgniter的人来说,我们依然提供了替换和扩展核心系统类的选择.

注意:  改变系统核心类会产生很大影响,所以在你做之前必须清楚地知道自己正在做什么.

系统类清单

以下是系统核心文件的清单,它们在每次CodeIgniter启动时被调用:

  • Benchmark
  • Config
  • Controller
  • Exceptions
  • Hooks
  • Input
  • Language
  • Loader
  • Log
  • Output
  • Router
  • URI
  • Utf8

替换核心类

要使用你自己的系统类替换默认类只需简单的将你自己的 .php 文件放入本地文件夹 application/core

application/core/some-class.php

如果这个文件夹不存在你可以自己创建一个.

只要你自定义的文件名与默认的完全一样,它就会自动替换原有的类.

要注意的是你自定义的类必须以CI作为前缀,例如你自己建立了Input.php类的名字必须是:

class CI_Input {

}

扩展核心类

如果你需要在现有类库中加入一两个新的功能,那就完全不必要替换整个类库文件.你只需简单地扩展(继承)现有的类,扩展一个类就像在类中增加一些例外:

  • 扩展的类必须申明由父类扩展而来.
  • 新扩展的类所在的文件必须以 MY_ 为前缀(这个选项是可配置的,下面有说明).

例如,要扩展原有的Input 类,你应该新建一个文件名为application/core/MY_Input.php, 并按如下声明你的类:

class MY_Input extends CI_Input {

}

注意:如果你需要在类中使用构造函数,你必须在构造函数中显式继承父类构造函数:

class MY_Input extends CI_Input {

    function __construct()
    {
        parent::__construct();
    }
}

Tip:  所有在你的新类中定义的函数如果与父类中函数的命名完全一样,这些函数就能取代父类中原有的函数 (这也被称为"方法覆盖").这允许你在本质上改变CodeIgniter的核心.

如果你扩展了控制器核心类,那么也要在你的应用程序控制器的构造函数中使用这个新类。

class Welcome extends MY_Controller {

    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        $this->load->view('welcome_message');
    }
}

自定义前缀

要设定你自己的子类前缀,请打开application/config/config.php 文件并找到这一项:

$config['subclass_prefix'] = 'MY_';

请注意所有原始CodeIgniter类库以 CI_ 作为前缀,所以请勿以CI_作为你自己的前缀.所有的扩展核心类必须放到core目录中!