创建类库

当我们使用术语"类库"时,我们一般指的是位于libraries 文件夹中的类,它们在wiki的"类库参考"这个板块被讨论.在当前这个话题中,我们将讨论如何在 application/libraries 文件夹中建立你自己的类库,并使它们与全框架的资源维持分离.

作为一个额外的功能,当你需要在原始类中简单地添加一些功能时,CodeIgniter能使你的类库extend 自原始类.你甚至可以通过在application/libraries文件夹下安放同名类库文件的方法来完全替换原始类.

总之:

  • 你可以创建全新的类库.
  • 你可以扩展原始类库.
  • 你可以替换原始类库.

以下页面将深入介绍这三个概念.

注意: 除了数据库类无法被扩展或替换,剩余其他类均可。

建立你的类库文件

你的类库文件必须保存在 application/libraries 文件夹,CodeIgniter将在这个文件夹中寻找并初始化它们.

命名约定

  • 文件名首字母大写. 例如:  Myclass.php
  • 类声明首字母大写. 例如:  class Myclass
  • 类的名字和文件名应相同.

类文件

所有的类应有基础原型(注意,这里我们以 Someclass 这个名字为例):

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

public function some_function()
    {
    }
}

/* End of file Someclass.php */

使用你自己的类

在所有的Controller 函数中,你可以用以下的标准方式初始化你的类:

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

当 someclass 是文件名时,不用加上".php"扩展名.这里名字不分大小写.

一旦你自定义的类加载完毕,你可以通过以下方式调用类,注意使用 小写 的名字:

$this->someclass->some_function();  // 对象的实例名永远都是小写的

在初始化自定义类时传递参数

当初始化类库时,你可以通过第二个参数动态的传递数组到类的构造函数中去:

$params = array('type' => 'large', 'color' => 'red');

$this->load->library('Someclass', $params);

当你使用这个特性时,你必须为类的构造函数加上参数:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Someclass {

public function __construct($params)
    {
        // Do something with $params
    }
}

?>

你也可以传递存于配置文件中的参数.你只需简单的建立一个与 类文件名相同的config文件,并保存在 application/config/ 文件夹中.注意当你通过上文所述的方式动态传递参数时,config文件中的选项将不起作用.

在你自定义的类库中初始化CodeIgniter资源

要在你自定义的类库中访问CodeIgniter的原始资源,你必须使用 get_instance() 函数.这个函数返回一个CodeIgniter super object.

一般来说在你的控制器函数中你可以通过 $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 对象,而不是创建一个副本。

用你自己的类替换原始类

简单的将你自己的类命名为与原始类一样就能使CodeIgniter使用这个新类.要使用这个特性,文件名与类声明必须与原始类完全一致。例如,要替换原始的 Email 类库。你必须创建一个文件application/libraries/Email.php, 并按如下方式声明类:

class CI_Email {

}

注意大多数原始类以CI_为前缀.

你可以只用标准载入函数来载入你自己的类:

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

注意: 这个时候Database无法替换为你自定义的类.

扩展现有类

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

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

例如,要扩展原始类 Email 类你要建立文件 application/libraries/MY_Email.php, 并按如下方式在文件中声明:

class MY_Email extends CI_Email {

}

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

class MY_Email extends CI_Email {

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

载入你的子类

要载入扩展子类,你应该使用标准字符名. 请不要使用前缀. 例如,要载入上文说过的email扩展子类,你应该这样写:

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

扩展子类一旦被载入,就能像一般的类一样使用它们. Email类中的所有函数就能被调用:

$this->email->some_function();

设定自定义前缀

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

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

注意所有原始CodeIgniter类库以 CI_ 作为前缀,所以请勿以CI_作为你自己的前缀.

**CI创建类库(创建自己的工具类等)的更多相关文章

  1. 快速创建SpringBoot2.x应用之工具类自动创建web应用、SpringBoot2.x的依赖默认Maven版本

    快速创建SpringBoot2.x应用之工具类自动创建web应用简介:使用构建工具自动生成项目基本架构 1.工具自动创建:http://start.spring.io/ 2.访问地址:http://l ...

  2. Java常用类库API之数字处理工具类

    数字处理工具类BigDecimal和DecimalFormat Java提供的java.text.DecimalFormat类,帮助我们用最快的速度将数据格式化为我们想要的样子.例如,取两位小数 im ...

  3. Android中创建倒影效果的工具类

                     一.有时候我们需要创建倒影的效果,我们接触最多的都是图片能够创建倒影,而布局依然可以创建倒影.       二.工具类代码 import android.graphi ...

  4. POI读取excel工具类 返回实体bean集合(xls,xlsx通用)

    本文举个简单的实例 读取上图的 excel文件到 List<User>集合 首先 导入POi 相关 jar包 在pom.xml 加入 <!-- poi --> <depe ...

  5. [java工具类01]__构建格式化输出日期和时间的工具类

    在之前的学习中,我写过一篇关于字符串格式化的,就主要设计到了时间以及日期的各种格式化显示的设置,其主要时通过String类的fomat()方法实现的. 我们可以通过使用不同的转换符来实现格式化显示不同 ...

  6. Android工具类整合

    Android-JSONUtil工具类 常用的Json工具类,包含Json转换成实体.实体转json字符串.list集合转换成json.数组转换成json public class JSONUtil ...

  7. 工具类(设置控件 frame) - iOS

    为了便于日常开发效率,因此创建了一些小的工具类便于使用. 具体 code 如下: 声明: #import <UIKit/UIKit.h> @interface UIView (Frame) ...

  8. 工具类(过滤接口空值, value 或 空字符串) - iOS

    为了便于日常开发效率,因此创建了一些小的工具类便于使用.具体 code 如下:声明: #import <Foundation/Foundation.h> #import <UIKit ...

  9. 工具类(为控件设置圆角) - iOS

    为了便于日常开发效率,因此创建了一些小的工具类便于使用.具体 code 如下:声明: /* 为控件添加边框样式_工具类 */ #import <UIKit/UIKit.h> typedef ...

  10. 工具类(为控件设置色值) - iOS

    为了便于日常开发效率,因此创建了一些小的工具类便于使用.具体 code 如下:声明: /* 为控件设置色值 */ #import <UIKit/UIKit.h> @interface UI ...

随机推荐

  1. 苹果ATS 豁免摆乌龙?

    现象 我们的App已经完成了NA部分的ATS适配.网页端由于有使用到第三方的页面,所以开启了网页的豁免权限.关于如何开启豁免及方法,可以参考喵神的Blog最终,我们的适配参数为: NSAllowsAr ...

  2. anaconda的spyder打不开

    因为最近一段时间没有用Spyder,今天使用时,发现Spyder又又打不开了. 之前遇到Spyder打不开的情况时,是根据这里的教程:删除.matplotlib和.spyder两个文件,但这次删除这两 ...

  3. Good Bye 2018 没打记

    场外选手赛时只口胡出了CD感觉非常惨.只看了E并且还没看到题面里的wiki我能咋办 C:f只与gcd(n,k)有关. D:考虑每种起始位置,对于跨越的两个排列,只有前一个排列的后缀单减时不产生贡献.答 ...

  4. css雪碧(CSS Sprite)和css3过渡效果综合应用

    在网页中我们经常可以看到,有些图片在鼠标经过的时候,有一个上下或左右的滑动效果,很实用页很方便,今天正好用到,拿来和大家分享一下,有什么不对或意见欢迎指正. html部分如下,这里本来打算用jq来着, ...

  5. import static和import的区别(转)

    import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....Cl ...

  6. oracle12c ORA-28040: No matching authentication protocol

    出错原因:11G客户端连12C数据库服务端会报这个错 解决方案一:CSDN优质解决方案,大家都说可以,然而我这边操作了不行 转自13楼:http://bbs.csdn.net/topics/39066 ...

  7. 【题解】 Test 买水的ACX(套路)

    题目描述: ACX在××信竞组学会信息竞赛,但是他的同学都很巨,于是要他去买水,结果来到某个买水的商店(奇奇怪怪的商店). 一天,ACX买了 N 个容量可以认为是无限大的瓶子,初始时每个瓶子里有 1  ...

  8. 以太坊 链私有链环境搭建(windows)

    摸索以太坊区块链技术几个月了.最近打算逐步的把自己学到的东西和大家分享一下.在阅读本文之前,希望大家能对区块链的概念能有所了解.这样操作过程中的环节理解更深入.下面开始进入准备.因为本次是window ...

  9. stm32 外设使用的配置步骤

    @2018-5-10  使用外设的配置步骤 #1 打开时钟 > 打开外设时钟 > 打开相关GPIO时钟 > 打开DMA时钟  (若需要) #2 关联外设与GPIO > 复位关联 ...

  10. emoji表情与unicode编码互转(JS,JAVA,C#)

    1.表情字符转编码 [C#] Encoding.UTF32.GetBytes("