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 相关文章推荐
PHP4在WinXP下IIS和Apache2服务器上的安装实例
Oct 09 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
Jun 03 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
php中get_defined_constants函数用法实例分析
May 12 PHP
ThinkPHP进程计数类Process用法实例详解
Sep 25 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP加密解密类实例代码
Jul 20 PHP
PHP命名空间namespace用法实例分析
Sep 27 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
May 15 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 PHP
php swoft框架实例用法
Dec 22 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
世界上第一台立体声收音机
2021/03/01 无线电
php 获取一个月第一天与最后一天的代码
2010/05/16 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
PHP使用函数用法详解
2018/09/30 PHP
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
一个因@click.stop引发的bug的解决
2019/01/08 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
python实现移位加密和解密
2019/03/22 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
详解python播放音频的三种方法
2019/09/23 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
利用jupyter网页版本进行python函数查询方式
2020/04/14 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
欧克利英国官网:Oakley英国
2019/08/24 全球购物
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
物流管理专业应届生求职信
2013/11/21 职场文书
简历的个人自我评价范文
2014/01/03 职场文书
给朋友的道歉信
2014/01/09 职场文书
读书活动实施方案
2014/03/10 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
建国大业观后感600字
2015/06/01 职场文书
2016入党心得体会范文
2016/01/06 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python