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 相关文章推荐
mysql 的 like 问题,超强毕杀记!!!
Jan 18 PHP
php mysql Errcode: 28 终极解决方法
Jul 01 PHP
在smarty中调用php内置函数的方法
Feb 07 PHP
PHP实现读取一个1G的文件大小
Aug 24 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
PHP输出缓冲控制Output Control系列函数详解
Jul 02 PHP
php连接oracle数据库的核心步骤
May 26 PHP
thinkPHP5框架自定义验证器实现方法分析
Jun 11 PHP
PHP实现的装箱算法示例
Jun 23 PHP
使用laravel和ECharts实现折线图效果的例子
Oct 09 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 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 Mssql操作简单封装支持存储过程
2009/12/11 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
json 定义
2008/06/10 Javascript
web 页面分页打印的实现
2009/06/22 Javascript
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
基于jquery的模态div层弹出效果
2010/08/21 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
jQuery+jRange实现滑动选取数值范围特效
2015/03/14 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
2016/09/29 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
Bootstrap表格使用方法详解
2017/02/17 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python中__call__内置函数用法实例
2015/06/04 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
python不同版本的_new_不同点总结
2020/12/09 Python
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
经典优秀个人求职信分享
2013/12/12 职场文书
个人承诺书
2014/03/26 职场文书
库房保管员岗位职责
2014/04/07 职场文书
广告学专业求职信
2014/06/19 职场文书
2015年科普工作总结
2015/07/23 职场文书
思想工作总结范文
2015/08/12 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python
用python修改excel表某一列内容的操作方法
2021/06/11 Python