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,不用COM,生成excel文件
Oct 09 PHP
php5.2时间相差8小时
Jan 15 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
CI框架装载器Loader.php源码分析
Nov 04 PHP
浅谈php命令行用法
Feb 04 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
wamp服务器访问php非常缓慢的解决过程
Jul 01 PHP
php提高网站效率的技巧
Sep 29 PHP
php实现购物车功能(上)
Jul 23 PHP
golang与PHP输出excel示例
Jul 22 PHP
PHP网页安全认证的实例详解
Sep 28 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中文汉字验证码
2007/04/08 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
JS实现的省份级联实例代码
2013/06/24 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
JavaScript中Null与Undefined的区别解析
2015/06/30 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
对angular4子路由&辅助路由详解
2018/10/09 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
python制作抖音代码舞
2019/04/07 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
工作检讨书怎么写
2014/10/10 职场文书
助学金感谢信
2015/01/20 职场文书
2015年护士节活动总结
2015/02/10 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
求职自我推荐信
2015/03/24 职场文书
计划生育责任书
2015/05/09 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript