创建库 | 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_为前缀,因此请勿将其用作前缀。