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模板引擎SMARTY
Oct 09 PHP
用PHP实现多级树型菜单
Oct 09 PHP
PHP5 操作MySQL数据库基础代码
Sep 29 PHP
PHP开发过程中常用函数收藏
Dec 14 PHP
Cakephp 执行主要流程
Mar 24 PHP
PHP操作xml代码
Jun 17 PHP
按上下级层次关系输出内容的PHP代码
Jul 17 PHP
windows下升级PHP到5.3.3的过程及注意事项
Oct 12 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
Oct 29 PHP
PHP防止post重复提交数据的简单例子
Jun 07 PHP
利用PHP自动生成印有用户信息的名片
Aug 01 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 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提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
PHP字符串的编码问题的详细介绍
2013/04/27 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
jquery ajax执行后台方法
2010/03/18 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
angularjs $http实现form表单提交示例
2017/06/09 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
python 控制语句
2011/11/03 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
python处理csv中的空值方法
2018/06/22 Python
详解django2中关于时间处理策略
2019/03/06 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
应届生高等护理求职信
2013/10/12 职场文书
黄金搭档广告词
2014/03/21 职场文书
旅游文化节策划方案
2014/06/06 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL