让CI框架支持traits新特性
为了对标java等编程语言的多继承特性,php官方从5.4版本起,推出了一种新的代码复用机制traits,熟悉使用traits的同学,应该都会喜欢使用它。对不不熟悉它的同学,官网解释已经很简洁了,我直接引用之:
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。
详细了解可点击:
http://php.net/manual/zh/language.oop5.traits.php
CI框架目前还没有完美支持traits,代码复用大都还是通过古老的helpers,我们在编程时,类里面如果要做代码复用,大概率会选择它,但它并不够友好,破坏了类的封装美感,如果在编写helper函数时不够严谨,容易引起公共耦合,严重影响系统结构的可读性、可维护性,怎么让CI框架支持traits特性,可以自动加载它,跟我一起做吧:
一,修改system\core\Loader.php脚本
对CI_Loader新增两个类属性,以及一个类方法,代码如下:
class CI_Loader {/*** List of loaded traits** @var array*/protected $_ci_traits = array();/*** List of paths to load traits from** @var array*/protected $_ci_trait_paths = array(APPPATH);/*** Traits Loader** @param string|string[] $traits trait name(s)* @return object*/public function traits($traits = array()){is_array($traits) OR $traits = array($traits);foreach ($traits as &$trait){$filename = basename($trait);$filepath = ($filename === $trait) ? '' : substr($trait, 0, strlen($trait) - strlen($filename));$filename = strtolower(preg_replace('#(_trait)?(\.php)?$#i', '', $filename));$trait = $filepath.$filename;if (isset($this->_ci_traits[$trait])){continue;}// Is this a helper extension request?$ext_trait = config_item('subclass_prefix').$filename;$ext_loaded = FALSE;foreach ($this->_ci_trait_paths as $path){if (file_exists($path.'traits/'.$ext_trait.'.php')){include_once($path.'traits/'.$ext_trait.'.php');$ext_loaded = TRUE;}}// If we have loaded extensions - check if the base one is hereif ($ext_loaded === TRUE){$base_trait = BASEPATH.'traits/'.$trait.'.php';if ( ! file_exists($base_trait)){show_error('Unable to load the requested file: traits/'.$trait.'.php');}include_once($base_trait);$this->_ci_traits[$trait] = TRUE;log_message('info', 'Trait loaded: '.$trait);continue;}// No extensions found ... try loading regular traits and/or overridesforeach ($this->_ci_trait_paths as $path){if (file_exists($path.'traits/'.$trait.'.php')){include_once($path.'traits/'.$trait.'.php');$this->_ci_traits[$trait] = TRUE;log_message('info', 'Trait loaded: '.$trait);break;}}// unable to load the helperif ( ! isset($this->_ci_traits[$trait])){show_error('Unable to load the requested file: traits/'.$trait.'.php');}}return $this;}
}
二、新建application\traits目录
三、编写trait类,application\traits\Payment_utils.php示例代码如下:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');/*** Payment_utils** PHP 5.4 compatibility interface** @package CodeIgniter* @subpackage Libraries* @category Payment* @author Eric <think2017@gmail.com>* @link https://zhuanlan.zhihu.com/paycenter*/
trait Payment_utils {/*** DES加密 ECB模式** @param string $value 明文* @return string $ret 密文*/function encrypt($value){$td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_ECB, '');$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);$key = substr(PAY_SECRET_KEY, 0, mcrypt_enc_get_key_size($td));mcrypt_generic_init($td, $key, $iv);$ret = base64_encode(mcrypt_generic($td, $value));mcrypt_generic_deinit($td);mcrypt_module_close($td);return $ret;}/*** DES解密 ECB模式** @param string $ret 密文* @return string $value 明文*/function decrypt($value){$td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_ECB, '');$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);$key = substr(PAY_SECRET_KEY, 0, mcrypt_enc_get_key_size($td));mcrypt_generic_init($td, $key, $iv);$ret = trim(mdecrypt_generic($td, base64_decode($value))) ;mcrypt_generic_deinit($td);mcrypt_module_close($td);return $ret;}
}
四、修改配置文件 application\config\autoload.php,新增以下代码:
<?php$autoload['traits'] = array('Payment_utils');
五、Testing
<?phpabstract class Wechat_driver implements PaymentHandlerInterface {use Payment_utils;protected $_config;//...
}
让CI框架支持traits新特性相关推荐
- PHP的学习--Traits新特性
2019独角兽企业重金招聘Python工程师标准>>> PHP的学习--Traits新特性 在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. 自 PHP ...
- 关于html5支持与否的判断(JS检测是否支持HTML5新特性)
未来使用H5的场景会越来越多,这是令 web开发者欢欣鼓舞的事情.然而有一个现实我们不得不看清,那就是IE系列浏览器还占有一大部分市场份额,以IE8.9为主,windows8.1的用户已经用上了IE1 ...
- Android各大版本支持的新特性的汇总
Android4.0(api 14) Space 留白 PopupMenu GlidLayout 网格布局 Android5.0(api 21) MaterialDesign设计风格 Material ...
- PHP 实现代码复用的一个方法 traits新特性
在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits. Traits 是一种为类似 PHP 的 ...
- PHP -- Traits新特性
原文地址:http://www.cnblogs.com/CraryPrimitiveMan/p/4162738.html 在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. ...
- Spring 4.x框架中的新特性---Spring4.0框架的新功能和改善
2004年Spring框架首次发布,然后陆续发布了一些重要的版本:Spring2.0提供XML命名空间和AspectJ的支持:Spring2.5包含了注释驱动配置:Spring3.0在框架基础代码中引 ...
- Spring4新特性——Web开发的增强
2019独角兽企业重金招聘Python工程师标准>>> Spring4新特性--泛型限定式依赖注入 Spring4新特性--核心容器的其他改进 Spring4新特性--Web开发的增 ...
- 【Sass】437- 一文详解Sass新特性 - 模块
本文来自[前端早读课],内容不错,推荐给大家. 前言 原来是今年才推出的.今日早读文章由@十方魔投稿分享. 正文从这开始-- 简介 2019年十月一号,sass团队推出了sass的模块化机制,通过新关 ...
- Atitit.atiJsBridge 新特性v7q329
Atitit.atiJsBridge 新特性v7q329 atiJsBridge 未来计划 Postdata 图像上传的支持 Simp param计划 p1 p2 p3 p4 $method 的si ...
- Spring4新特性——核心容器的其他改进
2019独角兽企业重金招聘Python工程师标准>>> Spring4新特性--泛型限定式依赖注入 Spring4新特性--核心容器的其他改进 Spring4新特性--Web开发的增 ...
最新文章
- POJ 2389	Bull Math(水~Java -大数相乘)
- SVN客户端--TortoiseSVN使用说明
- android Calendar使用 年月日时分秒
- 关于Spring MVC 中地址栏访问 /WEB-INF下的.jsp
- 太神奇!波士顿动力机器狗即将长出手臂,还能自己跑去充电
- 快手国际化事业部组织架构调整 在事业部内单独设立国际化商业化部
- IPv6协议漏洞将威胁核心路由器安全
- linux 查看md5值
- 将unity地形转换为mesh
- 名帖108 鲜于枢 行楷《麻徵君透光古镜歌》
- 计算机科学期刊是b类吗,《计算机科学》体例格式
- 看过来!看过来!网络安全类的认证课程都在这里
- html列表序号为圆点的,HTML_列表标签
- 解除带宽限速,提升电脑网速
- 综述 | 最新双曲深度神经网络综述论文
- 网上书店订单流程c语言源代码,网上书店的设计及实现.doc
- 新鲜新奇事物_用新鲜形容事物很新奇的句子
- 世界顶级食材——挑动你的食欲
- 华为鸿蒙新机2k曲面屏,华为P40系列“登场”:2K曲面屏+前后8摄,鸿蒙系统就别想了...
- realEngine(UE4)实现开关门效果
热门文章
- 仅供自用,大学三年收藏夹
- 代码安全 | 什么是OWASP?OWASP十大漏洞解析
- 代码安全之代码混淆及加固(Android)
- activemq下载安装
- DSP开发,使用CCS软件建立工程以及烧录
- React Native踩坑新建的RN0.64项目无法在xcode 12.5上打开
- oracle vm virtualbox安装xp系统,怎么使用VirtualBOX安装XP系统?VirtualBOX安装WinXp系统图文教程...
- HID、SCSI、CCID设备的通信
- 应用密码学第6章——第七章
- 网页监控插件distill web monitor使用之监控亚马逊到货及价格