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也可以?成Shell Script
Oct 09 PHP
PHP中HTTP方式下的Gzip压缩传输方法举偶
Feb 15 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
PHP中用正则表达式清除字符串的空白
Jan 17 PHP
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
深入HTTP响应状态码速查表的详解
Jun 07 PHP
php有道翻译api调用方法实例
Dec 22 PHP
9个实用的PHP代码片段分享
Jan 22 PHP
php中执行系统命令的方法
Mar 21 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
PHP SFTP实现上传下载功能
Jul 26 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
删除数组元素实用的PHP数组函数
2008/08/18 PHP
php smarty模版引擎中的缓存应用
2009/12/11 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
PHP二维数组去重算法
2016/12/17 PHP
PDO::rollBack讲解
2019/01/29 PHP
js 可拖动列表实现代码
2011/12/13 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
3种vue路由传参的基本模式
2018/02/22 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
vscode配置anaconda3的方法步骤
2020/08/08 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
传播学毕业生求职信
2013/10/11 职场文书
物流管理毕业生自荐信
2013/10/24 职场文书
党员自我评价分享
2013/12/13 职场文书
物流仓管员工作职责
2014/01/06 职场文书
电子信息工程专业推荐信
2014/02/14 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
幼儿教师求职信
2014/05/24 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书