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 相关文章推荐
php为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 PHP
PHP多例模式介绍
Jun 24 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
php实现用已经过去多长时间的方式显示时间
Jun 05 PHP
开启PHP的伪静态模式
Dec 31 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
Jan 08 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP实现SMTP邮件的发送实例
Sep 27 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
imagettftext() 失效,不起作用
Mar 09 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翻页类
2009/06/01 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
[03:12]2016完美“圣”典风云人物:单车专访
2016/12/02 DOTA
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
python 获取list特定元素下标的实例讲解
2018/04/09 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
python文件选择对话框的操作方法
2019/06/27 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
如何提高MySql的安全性
2014/06/19 面试题
大学教师年终总结的自我评价
2013/10/29 职场文书
超市营业员岗位职责
2013/12/20 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
小人国观后感
2015/06/11 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
AI:如何训练机器学习的模型
2021/04/16 Python