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实现文件上传二法
Oct 09 PHP
php 删除数组元素
Jan 16 PHP
header导出Excel应用示例
Jan 24 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
PHP中使用TCPDF生成PDF文档实例
Jul 01 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
Smarty中的注释和截断功能介绍
Apr 09 PHP
thinkphp如何获取客户端IP
Nov 03 PHP
windows平台中配置nginx+php环境
Dec 06 PHP
PHP结合Mysql数据库实现留言板功能
Mar 04 PHP
php结合redis高并发下发帖、发微博的实现方法
Dec 15 PHP
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
Apr 01 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
一个程序下载的管理程序(二)
2006/10/09 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
一段多浏览器的&quot;复制到剪贴板&quot;javascript代码
2007/03/27 Javascript
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
python manage.py runserver流程解析
2019/11/08 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
超市营业员岗位职责
2013/12/20 职场文书
交通事故私了协议书
2014/04/16 职场文书
《赶海》教学反思
2014/04/20 职场文书
奠基仪式策划方案
2014/05/15 职场文书
高三英语复习计划
2015/01/19 职场文书
个人简历自我评价怎么写
2015/03/10 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
Python如何快速找到多个字典中的公共键(key)
2022/04/29 Python
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS