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 相关文章推荐
Mysql中limit的用法方法详解与注意事项
Apr 19 PHP
php 定义404页面的实现代码
Nov 19 PHP
phpstrom使用xdebug配置方法
Dec 17 PHP
PHP编程风格规范分享
Jan 15 PHP
Yii调试SQL的常用方法
Jul 09 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 03 PHP
laravel-admin 中列表筛选方法
Oct 03 PHP
解决tp5在nginx下修改配置访问的问题
Oct 16 PHP
phpquery中文手册
Mar 18 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
php4的彩蛋
2006/10/09 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
jQuery 表格工具集
2010/04/25 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
2019/07/19 Javascript
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
python进阶教程之动态类型详解
2014/08/30 Python
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
python3实现暴力穷举博客园密码
2016/06/19 Python
Python实现将Excel转换为json的方法示例
2017/08/05 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
华为python面试题
2016/05/03 面试题
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
高中生校园生活自我评价
2013/09/19 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
2014年冬季防火方案
2014/05/21 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
民事赔偿协议书
2014/11/02 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
交流会主持词
2015/07/02 职场文书
小学科学课教学反思
2016/02/23 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python