CodeIgniter扩展核心类实例详解


Posted in PHP onJanuary 20, 2016

本文实例讲述了CodeIgniter扩展核心类的方法。分享给大家供大家参考,具体如下:

CI中对核心类、辅助类和函数的扩展是相当方便的,配置文件中指定了subclass_prefix扩展前缀,默认为MY_,扩展时需要以该配置为前缀,下面整理下扩展方式。

1、扩展核心类

核心类位于system/core下,其中大部分类会在初始化的时候自动加载。扩展核心类的方式有两种:替换核心类和继承核心类。

替换核心类

当application/core目录下存在与system/core同名的文件时会自动替换掉核心类。以Loader.php为例,当创建application/core/Loader.php后会自动加载该类,由于该类为系统核心类,所以,如果Loader.php未实现CI_Loader类中的方法则会报错,如:

class CI_Loader
{
  ...
}

替换核心类需要重写其中的所有方法,以免影响核心功能。但大部分时候并不需要重写整个核心,基本上只是增加某些方法,这个时候可以采取继承的方式。

继承核心类

继承核心类需要以subclass_prefix为前缀,如扩展Input类,需创建application/core/MY_Input.php,并且MY_Input需要继承CI_Input类,如:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Input extends CI_Input
{
  function _clean_input_keys($str)
  {
    $config = &get_config('config');
    if ( ! preg_match("/^[".$config['permitted_uri_chars']."]+$/i", rawurlencode($str))) {
      exit('Disallowed Key Characters.');
    }
    // Clean UTF-8 if supported
    if (UTF8_ENABLED === TRUE) {
      $str = $this->uni->clean_string($str);
    }
    return $str;
  }
}
/* End of file MY_Input.php */
/* Location: ./application/core/MY_Input.php */

2、扩展CI类库

system/libraries下实现了一些辅助类,当有需要扩展这些类时,和核心类的处理方式是一样的,只不过目录变成了application/libraries

3、扩展辅助函数

辅助函数存放于application/helpers目录下,辅助函数的“继承”方式与上面相同。因为CI的辅助函数都有使用function_exists来判断是否存在,所以也可以达到“重写”的目的。如在array中新增一个数组排序方法:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * 对二维数组进行排序
 * 
 * @param array $data 需要排序的字段
 * @param array $sort_field 按哪个键进行排序,如果不是所有键中都含有该字段则返回原数组
 * @param array $sort_type 排序方式 SORT_ASC 升序 SORT_DESC 降序
 * @return array
 */
function array_field_sort($data, $sort_field, $sort_type = SORT_ASC)
{
  if(! is_array($data)) {
    return false;
  }
  $sort_arr = array();
  foreach($data as $key => $val) {
    if(isset($val[$sort_field])) {
      $sort_arr[$key] = $val[$sort_field];
    }
  }
  if(count($sort_arr) == count($data)) {
    array_multisort($sort_arr, $sort_type, $data);
  }
  return $data;
}
/* End of file MY_array_helper.php */
/* Location: ./application/helpers/MY_array_helper.php */

总的来说,可以对CI框架system目录下的大部分内容进行重写,灵活度很高,扩展也很方便。但有时候也需要注意一下,并不是扩展的越多就越好,确保CI实现不了的功能再去扩展。最后既然CI提供了扩展的功能,就不要直接去修改system下的内容了。

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
IIS环境下快速安装、配置和调试PHP5.2.0
Dec 17 PHP
php程序的国际化实现方法(利用gettext)
Aug 14 PHP
php 操作符与控制结构
Mar 07 PHP
php中设置index.php文件为只读的方法
Feb 06 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
php实现MD5加密16位(不要默认的32位)
Aug 12 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
Nov 22 PHP
php实现格式化多行文本为Js可用格式
Apr 15 PHP
php实现XSS安全过滤的方法
Jul 29 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
Laravel框架实现多数据库连接操作详解
Jul 12 PHP
CodeIgniter视图使用注意事项
Jan 20 #PHP
CodeIgniter读写分离实现方法详解
Jan 20 #PHP
PHP实现微信网页授权开发教程
Jan 19 #PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 #PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 #PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 #PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 #PHP
You might like
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
IE6,IE7下js动态加载图片不显示错误
2010/07/17 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
ExtJS的拖拽效果示例
2013/12/09 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
Django保护敏感信息的方法示例
2019/05/09 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
Django中的cookie和session
2019/08/27 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
python xlsxwriter模块的使用
2020/12/24 Python
美赞臣营养马来西亚旗舰店:Enfagrow马来西亚
2019/07/26 全球购物
文明倡议书
2015/01/19 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
计划生育责任书
2015/05/09 职场文书
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
MySQL连接控制插件介绍
2021/09/25 MySQL
angular4实现带搜索的下拉框
2022/03/25 Javascript
Go语言怎么使用变长参数函数
2022/07/15 Golang