创建核心系统类
每次 CodeIgniter 运行时,都会自动初始化几个基本类作为核心框架的一部分。但是,可以用你自己的版本替换任何核心系统类,或者只是扩展核心版本。
大多数用户都不需要这样做,但对于那些想要显着改变 CodeIgniter 核心的人来说,替换或扩展它们的选项确实存在。
重要
与核心系统类打交道有很多影响,所以在尝试之前,请确保你知道你在做什么。
系统类列表
以下是每次 CodeIgniter 运行时都会调用的核心系统类列表:
- CodeIgniter\Autoloader\Autoloader
- CodeIgniter\CodeIgniter
- CodeIgniter\Config\DotEnv
- CodeIgniter\Config\Services
- CodeIgniter\Controller
- CodeIgniter\Debug\Exceptions
- CodeIgniter\Debug\Timer
- CodeIgniter\Events\Events
- CodeIgniter\Filters\Filters
- CodeIgniter\HTTP\ContentSecurityPolicy
- CodeIgniter\HTTP\CLIRequest(如果仅从命令行启动)
- CodeIgniter\HTTP\IncomingRequest(如果通过 HTTP 启动)
- CodeIgniter\HTTP\Request
- CodeIgniter\HTTP\Response
- CodeIgniter\HTTP\Message
- CodeIgniter\HTTP\URI
- CodeIgniter\Log\Logger
- CodeIgniter\Log\Handlers\BaseHandler
- CodeIgniter\Log\Handlers\FileHandler
- CodeIgniter\Router\RouteCollection
- CodeIgniter\Router\Router
- CodeIgniter\View\View
替换核心类
要使用自己的系统类代替默认类,请确保:
创建你的类
例如,如果你有一个新的 App\Libraries\RouteCollection 类,想用它代替核心系统类,你会这样创建你的类:
<?php
namespace App\Libraries;
use CodeIgniter\Router\RouteCollectionInterface;
class RouteCollection implements RouteCollectionInterface
{
    // ...
}
添加服务
然后你需要在 app/Config/Services.php 中添加 routes 服务来加载你的类:
<?php
namespace Config;
use CodeIgniter\Config\BaseService;
class Services extends BaseService
{
    public static function routes(bool $getShared = true)
    {
        if ($getShared) {
            return static::getSharedInstance('routes');
        }
        return new \App\Libraries\RouteCollection(static::locator(), config('Modules'));
    }
    // ...
}
扩展核心类
如果你只需要为现有库添加一些功能 - 可能添加一两个方法 - 那么重新创建整个库就有点过度设计。在这种情况下,最好简单地扩展该类。扩展该类与 替换核心类 几乎相同,只有一个例外:
- 类声明必须扩展父类。 
例如,要扩展原生的 RouteCollection 类,你需要用以下方式声明你的类:
<?php
namespace App\Libraries;
use CodeIgniter\Router\RouteCollection;
class RouteCollection extends RouteCollection
{
    // ...
}
如果你的类中需要使用构造函数,请确保扩展父类构造函数:
<?php
namespace App\Libraries;
use CodeIgniter\Router\RouteCollection as BaseRouteCollection;
class RouteCollection extends BaseRouteCollection
{
    public function __construct()
    {
        parent::__construct();
        // your code here
    }
}
提示: 你类中与父类方法同名的任何函数都会代替原生的方法(这被称为“方法重载”)。这允许你大幅改变 CodeIgniter 核心。