发布于 2015-10-30 16:10:43 | 205 次阅读 | 评论: 0 | 来源: 网络整理
当我们使用术语类库时,我们一般指的是位于 libraries 文件夹中的类,并在这个文档的“类库参考”中介绍过。在这里,我们讨论一下如何在 application/libraries 文件里创建自己的类库,并使你的本地资源和全局框架资源保持独立。
作为一个额外的功能,如果你只是简单给存在的库添加一些函数,CodeIgniter 允许你的库扩展自原始类。甚至你可以在 application/libraries 文件夹里,放同名的类库文件来替换原始库。
总之:
下面的内容将详细介绍这 3 点。
注意: 数据库类不能被扩展或替换,其他的都可以被扩展或替换。
你的类库必须放在 application/libraries 文件夹里,因为 CodeIgniter 将会在他们初始化的时候到这里找。
所有的类必须有基础原型:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Someclass {
public function some_method()
{
}
}
注意:我们这里用 Someclass 为例。
在控制器方法中,你可以使用以下的标准方法来初始化你的类:
$this->load->library('someclass');
其中 someclass 是文件名,没有 ".php" 文件扩展。文件名不区分大小写。
加载后,你可以用小写名来访问你的类:
$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
}
}
你也可以传递存储于配置文件中的参数。只需创建一个配置文件,他的文件名和类名一致,并存储在 application/config/ 文件夹里。注意,如果你按如上所述的方法传递参数,配置文件选项将不起作用。
要访问 CodeIgniter 的原生资源,可以在你的库里使用 get_instance()
方法。这个方法返回 CodeIgniter 父对象。
通常来说在你的控制器类里,你可以使用 $this
调用任何 CodeIgniter 方法。
$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 库,你可以创建一个文件 application/libraries/Email.php,并且声明你的类:
class CI_Email {
}
注意,多数原生类都以 CI\_
作为前缀。
可以用标准方法加载你的库:
$this->load->library('email');
注意: 原生数据库类不能被你的自定义类替换。
如果你仅仅需要给原生库添加一些函数,而不是完全替换它。你最好简单的扩展一下原生库。扩展一个类就像在一个类中添加一些例外:
MY\_
作为前缀(这个是可配置的,参见下面说明)。例如,要扩展原生的 Email 类,你需要创建的文件名为 application/libraries/MY_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');
一旦加载,就能像一般类一样使用他们。Email 类中得所有函数都能调用:
$this->email->some_method();
要设置你的自定义前缀,打开 application/config/config.php 文件,找到:
$config['subclass_prefix'] = 'MY_';
请注意,所有的原生 CodeIgniter 类库前缀都是 CI\_
,所以不要使用这个前缀。