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 curl获取301或302转向的网址问题的解决方法
Jun 02 PHP
PHP分多步骤填写发布信息的简单方法实例代码
Sep 23 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
php中apc缓存使用示例
Dec 25 PHP
用PHP和Shell写Hadoop的MapReduce程序
Apr 15 PHP
php采用file_get_contents代替使用curl实例
Nov 07 PHP
php json转换成数组形式代码分享
Nov 10 PHP
php列出mysql表所有行和列的方法
Mar 13 PHP
详解php几行代码实现CSV格式文件输出
Jul 01 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
php模式设计之观察者模式应用实例分析
Sep 25 PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 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中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
php开发工具有哪五款
2015/11/09 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
用JQUERY增删元素的代码
2012/02/14 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
详解JS函数stack size计算方法
2018/06/18 Javascript
redux.js详解及基本使用
2019/05/24 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
python抓取网页中的图片示例
2014/02/28 Python
深入讨论Python函数的参数的默认值所引发的问题的原因
2015/03/30 Python
Python中字符串对齐方法介绍
2015/05/21 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
python中的协程深入理解
2019/06/10 Python
python同步两个文件夹下的内容
2019/08/29 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
计算机专业优秀大学生自我总结
2014/01/21 职场文书
学子宴答谢词
2014/01/25 职场文书
秋季运动会活动方案
2014/02/05 职场文书
婚前财产公证书
2014/04/10 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
教师学期个人总结
2015/02/11 职场文书
行政申诉状范文
2015/05/20 职场文书
演讲稿之开卷有益
2019/08/07 职场文书