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 相关文章推荐
在线短消息收发的程序,不用数据库
Oct 09 PHP
php cookie 登录验证示例代码
Mar 16 PHP
PHP chmod 函数与批量修改文件目录权限
May 10 PHP
php小经验:解析preg_match与preg_match_all 函数
Jun 29 PHP
Linux下php5.4启动脚本
Aug 03 PHP
php中Ctype函数用法详解
Dec 09 PHP
php实现读取内存顺序号
Mar 29 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
PHP实现的简单分页类及用法示例
May 06 PHP
php获取flash尺寸详细数据的方法
Nov 12 PHP
php微信公众平台开发(一) 配置接口
Dec 06 PHP
ThinkPHP实现登录退出功能
Jun 29 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
MySQL授权问题总结
2007/05/06 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
PHP array_reverse() 函数原理及实例解析
2020/07/14 PHP
js控制框架刷新
2008/08/01 Javascript
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
美国著名手表网站:Timepiece
2017/11/15 全球购物
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
老师推荐信
2013/10/28 职场文书
2014年父亲节活动方案
2014/03/06 职场文书
企业出纳岗位职责
2014/03/12 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
公司收款委托书范本
2014/09/20 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
2014年班级工作总结
2014/11/14 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
培养联系人考察意见
2015/06/01 职场文书
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android
讲解MySQL增删改操作
2022/05/06 MySQL
Python可视化神器pyecharts绘制水球图
2022/07/07 Python