PHP对象链式操作实现原理分析


Posted in PHP onOctober 09, 2016

本文实例讲述了PHP对象链式操作实现原理。分享给大家供大家参考,具体如下:

什么是链式操作呢?使用jQuery的同学印象应该会很深刻.在jQuery中,我们经常会这样的来操作DOM元素:

$("p").css("color").addClass("selected");

连贯操作看起来的确很酷,也非常的方便代码的阅读.那么在PHP里面是否可以实现呢?答案是肯定的,当然了必须是在OOP中用才行,在过程化的程序中,就没有必要用这种方法了。

在PHP中,我们经常要使用很多函数:

$str = 'abs123 ';
echo strlen(trim($str));

上面代码的作用就是去除字符串两边的空格,然后输出其长度,那么使用链式编程就可以这样来:

$str = 'abs123 ';
echo $str->trim()->strlen();

是不是看着更加的舒服呢?这里主要是利用了PHP面向对象里面的 __call() 和 __toString() 魔术方法

/**
*  对象链式操作
*    2015-04-24
*/
class BaseChainObject{
    /**
* 追溯数据,用来进行调试
* @var array
*/
private $_trace_data = array();
    /**
    *    保存可用方法列表
    *    @param array
    */
    protected $_methods = array();
    /**
    *    处理的数据
    *    @param null
    */
    public $data;
    function __construct($data){
        $this->data = $data;
        $this->_trace_data['__construct'] = $data;
        return $this->data;
    }
    function __toString(){
        return (String)$this->data;
    }
    function __call($name,$args){
        try{
            $this->vaild_func($name);
        }catch(Exception $e){
            echo $e->getMessage();
            exit();
        }
        if (!$args) {
            $args = $this->data;
            $this->data = call_user_func($name,$args);
        }else{
            $this->data = call_user_func_array($name,$args);
        }
        $this->_trace_data[$name] = $this->data;
        return $this;
    }
    /**
    *    判断方法是否存在
    *    @param string
    */
    private function vaild_func($fn){
        if(!in_array($fn, $this->_methods)){
            throw new Exception("unvaild method");
        }
    }
    public function trace(){
      var_dump($this->_trace_data);
    }
}
class String extends BaseChainObject{
    protected $_methods = array('trim','strlen');
}
$str = new String('ab rewqc ');
echo $str->trim()->strlen();
$str->trace();

从以上代码可以看出,当调用对象中不存在的方法时,会自动触发__call()魔术方法,然后结合call_user_func()来执行链式操作,当输出对象的时候触发toString()来输出想要的结果.当然还有一个方案就是在自定义的方法中使用return this,也可以实现对象链式的操作,大家可以自己去试试看.

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
转换中文日期的PHP程序
Oct 09 PHP
PHP获取MAC地址的函数代码
Sep 11 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
php中使用url传递数组的方法
Feb 11 PHP
php HTML无刷新提交表单
Apr 05 PHP
深入浅析PHP无限极分类的案例教程
May 09 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 PHP
基于php流程控制语句和循环控制语句(讲解)
Oct 23 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
Laravel-添加后台模板AdminLte的实现方法
Oct 08 PHP
PHP封装请求类实例分析【基于Yii框架】
Oct 17 PHP
php传值和传引用的区别点总结
Nov 19 PHP
SAE实时日志接口SDK用法示例
Oct 09 #PHP
对PHP依赖注入的理解实例分析
Oct 09 #PHP
mac下多个php版本快速切换的方法
Oct 09 #PHP
Laravel中间件实现原理详解
Oct 09 #PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 #PHP
ThinkPHP的SAE开发相关注意事项详解
Oct 09 #PHP
Laravel的throttle中间件失效问题解决方法
Oct 09 #PHP
You might like
德生9700DX电路分析
2021/03/02 无线电
解析如何用php screw加密php源代码
2013/06/20 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
浅谈PHP进程管理
2019/03/08 PHP
Laravel框架实现多数据库连接操作详解
2019/07/12 PHP
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
2016/06/09 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
webpack4.0 入门实践教程
2018/10/08 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
用python与文件进行交互的方法
2018/03/01 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
python处理“
2019/06/10 Python
解决django中ModelForm多表单组合的问题
2019/07/18 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
logging level级别介绍
2020/02/21 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
香港礼品网站:GiftU eshop
2017/09/01 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
跟单文员的岗位职责
2013/11/14 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
伊索寓言教学反思
2014/05/01 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
语文教师个人工作总结
2015/02/06 职场文书
离婚起诉书范本
2015/05/18 职场文书
入团介绍人意见范文
2015/06/04 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python