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 相关文章推荐
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
php笔记之常用文件操作
Oct 12 PHP
分享PHP header函数使用教程
Sep 05 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
Jan 17 PHP
php中rename函数用法分析
Nov 15 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
php对关联数组循环遍历的实现方法
Mar 13 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
php实现微信公众号无限群发
Oct 11 PHP
Laravel实现表单提交
May 07 PHP
php中通用的excel导出方法实例
Dec 30 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
Jul 22 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中取得URL的根域名的代码
2011/03/23 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
百度地图api如何使用
2015/08/03 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
Windows下安装python2.7及科学计算套装
2015/03/05 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
matplotlib绘制动画代码示例
2018/01/02 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
2014年办公室工作总结范文
2014/11/12 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
Python时间操作之pytz模块使用详解
2022/06/14 Python