在线文档教程
Codeigniter 3

创建库 | Creating Libraries

创建库

当我们使用术语“库”时,我们通常是指位于库目录中的类,并在本用户指南的类引用中进行描述。但是,在本例中,我们将描述如何在应用程序/库目录中创建自己的库,以维护本地资源和全局框架资源之间的分离。

另外,CodeIgniter允许您的库扩展本机类,如果您只需要向现有库添加一些功能。或者,您甚至可以通过将同名版本放置在应用/图书馆目录。

总之:

  • 您可以创建全新的库。

  • 您可以扩展本机库。

  • 您可以替换本机库。

下面这一页详细解释了这三个概念。

数据库类不能扩展或替换为您自己的类。所有其他类都可以替换/扩展。

储物

库类应放在应用/图书馆目录,因为在初始化它们时,CodeIgniter将在这里查找它们。

命名公约

  • 文件名必须大写。例如:Myclass.php

  • 类声明必须大写。例如:类Myclass

  • 类名和文件名必须匹配。

类文件

类应该具有以下基本原型:

<?php defined('BASEPATH') OR exit('No direct script access allowed' class Someclass { public function some_method() { } }

我们纯粹是以Someclass这个名字为例。

使用你的类

从你的任何一个控制器方法可以使用以下标准初始化类:

$this->load->library('someclass'

何地小体是没有“.php”文件扩展名的文件名。您可以提交文件名大写或小写。CodeIgniter不在乎。

加载之后,可以使用小写版本访问类:

$this->someclass->some_method(  // Object instances will always be lower case

初始化类时传递参数

在库加载方法中,可以通过第二个参数动态地将数据作为数组传递,并将其传递给类构造函数:

$params = array('type' => 'large', 'color' => 'red' $this->load->library('someclass', $params

如果使用此特性,则必须设置类构造函数以期望数据:

<?php defined('BASEPATH') OR exit('No direct script access allowed' class Someclass { public function __construct($params) { // Do something with $params } }

还可以传递存储在配置文件中的参数。只需创建一个名与类文件名相同的配置文件,并将其存储在应用程序/配置/目录。注意,如果像上面描述的那样动态传递参数,则配置文件选项将不可用。

利用库中的CodeIgniter资源

若要访问库中CodeIgniter的本机资源,请使用get_instance()方法。此方法返回CodeIgniter超级对象。

通常在控制器方法中使用$this建造:

$this->load->helper('url' $this->load->library('session' $this->config->item('base_url' // etc.

$this但是,只在控制器、模型或视图中直接工作。如果您想在您自己的自定义类中使用CodeIgniter类,可以这样做:

首先,将CodeIgniter对象赋值给一个变量:

$CI =& get_instance(

一旦将对象赋值给变量,就会使用该变量相反$this*

$CI =& get_instance( $CI->load->helper('url' $CI->load->library('session' $CI->config->item('base_url' // etc.

你会注意到上面提到的get_instance()函数通过引用传递:

$CI =& get_instance(

这是非常重要的。引用赋值允许您使用原始的CodeIgniter对象,而不是创建它的副本。

但是,由于库是一个类,所以最好充分利用OOP原则。因此,为了能够在所有类方法中使用CodeIgniter超级对象,我们鼓励您将其分配给属性:

class Example_library { protected $CI; // We'll use a constructor, as you can't directly call a function // from a property definition. public function __construct() { // Assign the CodeIgniter super-object $this->CI =& get_instance( } public function foo() { $this->CI->load->helper('url' redirect( } public function bar() { echo $this->CI->config->item('base_url' } }

用您的版本替换本地库

简单地将类文件命名为本机库将导致CodeIgniter使用它而不是本机库。要使用此特性,必须将文件和类声明命名为与本机库完全相同的名称。例如,要替换本机电子邮件库,您将创建一个名为应用程序/库/Email.php,并以下列方式宣布您的班级:

class CI_Email { }

请注意,大多数原生类都以CI_为前缀。

要加载库,您将看到标准加载方法:

$this->load->library('email'

此时,不能用您自己的版本替换数据库类。

扩展本地图书馆

如果您需要做的就是向现有的库添加一些功能--也许添加一两个方法--那么用您的版本替换整个库就太过分了。在这种情况下,最好只是扩展类。扩展类与替换类几乎相同,但有几个例外:

  • 类声明必须扩展父类。

  • 您的新类名和文件名必须以[医]%28此项目是可配置的。见下文%29。

例如,要扩展本机电子邮件类,您将创建一个名为应用/图书馆/我[医]Email.php,并以下列方式宣布您的班级:

class MY_Email extends CI_Email { }

如果需要在类中使用构造函数,请确保扩展父构造函数:

class MY_Email extends CI_Email { public function __construct($config = array()) { parent::__construct($config } }

并不是所有的库在其构造函数中都有相同的(或任何)参数。看看你首先要扩展的库,看看它应该如何实现。

加载您的子类

要加载子类,您将使用通常使用的标准语法。不要包括你的前缀。例如,要加载上面的示例(它扩展了Email类),您将使用:

$this->load->library('email'

一旦加载,您将使用类变量,就像通常对您要扩展的类一样。对于电子邮件类,所有调用都将使用:

$this->email->some_method(

设置自己的前缀

若要设置自己的子类前缀,请打开application/config/config.php存档并查找此项目:

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

请注意,所有本机CodeIgniter库都以CI_为前缀,因此请勿将其用作前缀。