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 相关文章推荐
图书管理程序(二)
Oct 09 PHP
PHP UTF8编码内的繁简转换类
Jul 20 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
Sep 22 PHP
PHP+MySQL插入操作实例
Jan 21 PHP
php include类文件超时问题处理
Feb 06 PHP
JavaScript与HTML结合的基本使用方法整理
Oct 12 PHP
php封装的page分页类完整实例
Oct 18 PHP
php操作access数据库的方法详解
Feb 22 PHP
PHP常见过waf webshell以及最简单的检测方法
May 21 PHP
yii2 在控制器中验证请求参数的使用方法
Jun 19 PHP
php中钩子(hook)的原理与简单应用demo示例
Sep 03 PHP
laravel 实现向公共模板中传值 (view composer)
Oct 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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
探讨PHP调用时间格式的参数详解
2013/06/06 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
memcache一致性hash的php实现方法
2015/03/05 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
Yii实现简单分页的方法
2016/04/29 PHP
javascript定义函数的方法
2010/12/06 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
js改变css样式的三种方法推荐
2016/06/28 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
车间班长岗位职责
2013/11/30 职场文书
晚宴邀请函范文
2014/01/15 职场文书
青年文明号事迹材料
2014/01/18 职场文书
应用外语系自荐信
2014/06/26 职场文书
岗位安全生产责任书
2014/07/28 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
李强感恩观后感
2015/06/17 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
总结Java对象被序列化的两种方法
2021/06/30 Java/Android
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS
详解Python中__new__方法的作用
2022/03/31 Python
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫