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 has encountered an Access Violation
Jan 15 PHP
用PHP 快速生成 Flash 动画的方法
Mar 06 PHP
PHP5与MySQL数据库操作常用代码 收集
Mar 21 PHP
centos 5.6 升级php到5.3的方法
May 14 PHP
将时间以距今多久的形式表示,PHP,js双版本
Sep 25 PHP
PHP中调用C/C++制作的动态链接库的教程
Mar 10 PHP
抛弃 PHP 代价太高
Apr 26 PHP
Thinkphp 5.0实现微信企业付款到零钱
Sep 30 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
Jun 05 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
PHP实现递归的三种方法
Jul 04 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计算2点经纬度之间的距离代码
2013/08/12 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
2016/09/02 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
Python中方法链的使用方法
2016/02/23 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
pandas apply多线程实现代码
2020/08/17 Python
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
外贸英语毕业生自荐信
2013/11/14 职场文书
大学生表扬信范文
2014/01/09 职场文书
《寓言两则》教学反思
2014/02/27 职场文书
幼儿园老师寄语
2014/04/03 职场文书
党的群众路线教育实践活动专题组织生活会发言材料
2014/10/17 职场文书
PHP 时间处理类Carbon
2022/05/20 PHP
VUE递归树形实现多级列表
2022/07/15 Vue.js
httpclient调用远程接口的方法
2022/08/14 Java/Android