为了对标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新特性相关推荐

  1. PHP的学习--Traits新特性

    2019独角兽企业重金招聘Python工程师标准>>> PHP的学习--Traits新特性 在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. 自 PHP ...

  2. 关于html5支持与否的判断(JS检测是否支持HTML5新特性)

    未来使用H5的场景会越来越多,这是令 web开发者欢欣鼓舞的事情.然而有一个现实我们不得不看清,那就是IE系列浏览器还占有一大部分市场份额,以IE8.9为主,windows8.1的用户已经用上了IE1 ...

  3. Android各大版本支持的新特性的汇总

    Android4.0(api 14) Space 留白 PopupMenu GlidLayout 网格布局 Android5.0(api 21) MaterialDesign设计风格 Material ...

  4. PHP 实现代码复用的一个方法 traits新特性

    在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits. Traits 是一种为类似 PHP 的 ...

  5. PHP -- Traits新特性

    原文地址:http://www.cnblogs.com/CraryPrimitiveMan/p/4162738.html 在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. ...

  6. Spring 4.x框架中的新特性---Spring4.0框架的新功能和改善

    2004年Spring框架首次发布,然后陆续发布了一些重要的版本:Spring2.0提供XML命名空间和AspectJ的支持:Spring2.5包含了注释驱动配置:Spring3.0在框架基础代码中引 ...

  7. Spring4新特性——Web开发的增强

    2019独角兽企业重金招聘Python工程师标准>>> Spring4新特性--泛型限定式依赖注入 Spring4新特性--核心容器的其他改进 Spring4新特性--Web开发的增 ...

  8. 【Sass】437- 一文详解Sass新特性 - 模块

    本文来自[前端早读课],内容不错,推荐给大家. 前言 原来是今年才推出的.今日早读文章由@十方魔投稿分享. 正文从这开始-- 简介 2019年十月一号,sass团队推出了sass的模块化机制,通过新关 ...

  9. Atitit.atiJsBridge 新特性v7q329

    Atitit.atiJsBridge 新特性v7q329 atiJsBridge 未来计划 Postdata  图像上传的支持 Simp param计划 p1 p2 p3 p4 $method 的si ...

  10. Spring4新特性——核心容器的其他改进

    2019独角兽企业重金招聘Python工程师标准>>> Spring4新特性--泛型限定式依赖注入 Spring4新特性--核心容器的其他改进 Spring4新特性--Web开发的增 ...

最新文章

  1. POJ 2389 Bull Math(水~Java -大数相乘)
  2. SVN客户端--TortoiseSVN使用说明
  3. android Calendar使用 年月日时分秒
  4. 关于Spring MVC 中地址栏访问 /WEB-INF下的.jsp
  5. 太神奇!波士顿动力机器狗即将长出手臂,还能自己跑去充电
  6. 快手国际化事业部组织架构调整 在事业部内单独设立国际化商业化部
  7. IPv6协议漏洞将威胁核心路由器安全
  8. linux 查看md5值
  9. 将unity地形转换为mesh
  10. 名帖108 鲜于枢 行楷《麻徵君透光古镜歌》
  11. 计算机科学期刊是b类吗,《计算机科学》体例格式
  12. 看过来!看过来!网络安全类的认证课程都在这里
  13. html列表序号为圆点的,HTML_列表标签
  14. 解除带宽限速,提升电脑网速
  15. 综述 | 最新双曲深度神经网络综述论文
  16. 网上书店订单流程c语言源代码,网上书店的设计及实现.doc
  17. 新鲜新奇事物_用新鲜形容事物很新奇的句子
  18. 世界顶级食材——挑动你的食欲
  19. 华为鸿蒙新机2k曲面屏,华为P40系列“登场”:2K曲面屏+前后8摄,鸿蒙系统就别想了...
  20. realEngine(UE4)实现开关门效果

热门文章

  1. 仅供自用,大学三年收藏夹
  2. 代码安全 | 什么是OWASP?OWASP十大漏洞解析
  3. 代码安全之代码混淆及加固(Android)
  4. activemq下载安装
  5. DSP开发,使用CCS软件建立工程以及烧录
  6. React Native踩坑新建的RN0.64项目无法在xcode 12.5上打开
  7. oracle vm virtualbox安装xp系统,怎么使用VirtualBOX安装XP系统?VirtualBOX安装WinXp系统图文教程...
  8. HID、SCSI、CCID设备的通信
  9. 应用密码学第6章——第七章
  10. 网页监控插件distill web monitor使用之监控亚马逊到货及价格