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 程序员应该使用的10个组件
Oct 31 PHP
PHP 第一节 php简介
Apr 28 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
Dec 25 PHP
php判断字符串在另一个字符串位置的方法
Feb 27 PHP
分享下php5类中三种数据类型的区别
Jan 26 PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 PHP
PHP编程实现阳历转换为阴历的方法实例
Aug 08 PHP
Laravel 批量更新多条数据的示例
Nov 27 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
Django中通过定时任务触发页面静态化的处理方式
Aug 29 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
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
php 生成随机验证码图片代码
2010/02/08 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
php写入、删除与复制文件的方法
2015/06/20 PHP
PHP 微信支付类 demo
2015/11/30 PHP
php 使用curl模拟ip和来源进行访问的实现方法
2017/05/02 PHP
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
uploadify 3.0 详细使用说明
2012/06/18 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
2016/09/23 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
python如何查看系统网络流量的信息
2016/09/12 Python
Python多线程实现同步的四种方式
2017/05/02 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
Django中的Model操作表的实现
2018/07/24 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
自我评价格式
2014/01/06 职场文书
中层干部培训方案
2014/06/16 职场文书
如何写辞职书
2015/02/26 职场文书
2015年信访工作总结
2015/04/07 职场文书