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实现让页面只能被百度gogole蜘蛛访问的方法
Dec 29 PHP
PHP MySQL应用中使用XOR运算加密算法分享
Aug 28 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
Feb 12 PHP
PHP函数超时处理方法
Feb 14 PHP
java模拟PHP的pack和unpack类
Apr 13 PHP
php时间计算相关问题小结
May 09 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
php操作mongodb封装类与用法实例
Sep 01 PHP
php微信公众号开发之答题连闯三关
Oct 20 PHP
关于laravel 子查询 &amp; join的使用
Oct 16 PHP
PHP延迟静态绑定使用方法实例解析
Sep 05 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之真OO
2006/10/09 PHP
PHP 透明水印生成代码
2012/08/27 PHP
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
php中rename函数用法分析
2014/11/15 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
python+mysql实现简单的web程序
2014/09/11 Python
python实现自动更换ip的方法
2015/05/05 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
什么是python的列表推导式
2020/05/26 Python
如何用Python绘制3D柱形图
2020/09/16 Python
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
大学生自荐信范文
2015/03/05 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
紧急迫降观后感
2015/06/15 职场文书
投诉信范文
2015/07/02 职场文书
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android