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强制下载类型的实现代码
Apr 21 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
Aug 03 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
PHP中单引号与双引号的区别分析
Aug 19 PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 PHP
分享常见的几种页面静态化的方法
Jan 08 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
PHP _construct()函数讲解
Feb 03 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 PHP
基于PHP实现短信验证码发送次数限制
Jul 11 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
Nov 23 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
计算2000年01月01日起到指定日的天数
2006/10/09 PHP
第五章 php数组操作
2011/12/30 PHP
PHP正确解析UTF-8字符串技巧应用
2012/11/07 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
微信小程序wepy框架笔记小结
2018/08/08 Javascript
angular多语言配置详解
2019/05/16 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
python批量查询、汉字去重处理CSV文件
2018/05/31 Python
python机器人运动范围问题的解答
2019/04/29 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
优纳科技软件测试面试题
2012/05/15 面试题
计算机应届毕业生自荐信范文
2014/02/23 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
新春文艺演出主持词
2014/03/27 职场文书
爱心活动计划书
2014/04/26 职场文书
幼儿园老师工作总结2015
2015/05/22 职场文书
走近毛泽东观后感
2015/06/04 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python
详解Oracle块修改跟踪功能
2021/11/07 Oracle