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 21 PHP
php中session过期时间设置及session回收机制介绍
May 05 PHP
PHP小技巧之函数重载
Jun 02 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
PHP生成不重复标识符的方法
Nov 21 PHP
php中解析带中文字符的url函数分享
Jan 20 PHP
PHP Static延迟静态绑定用法分析
Mar 16 PHP
YII视图整合kindeditor扩展的方法
Jul 13 PHP
thinkPHP中volist标签用法示例
Dec 06 PHP
利用php + Laravel如何实现部署自动化详解
Oct 11 PHP
php 删除一维数组中某一个值元素的操作方法
Feb 01 PHP
php的instanceof和判断闭包Closure操作示例
Jan 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获取文件夹内文件数的方法
2015/03/12 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
扩展String功能方法
2006/09/22 Javascript
JavaScript中的isXX系列是否继续使用的分析
2011/04/16 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
jQuery如何获取同一个类标签的所有值(默认无法获取)
2014/09/25 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
python实现DES加密解密方法实例详解
2015/06/30 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
详解Python中的动态属性和特性
2018/04/07 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
python获取栅格点和面值的实现
2020/03/10 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
关于毕业的广播稿
2014/01/10 职场文书
工作失职检讨书范文
2014/01/16 职场文书
公务员综合考察材料
2014/02/01 职场文书
优秀团队获奖感言
2014/02/19 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
建筑节能汇报材料
2014/08/22 职场文书
标准单位租车协议书
2014/09/23 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers