php链式调用(链式操作)

2017年6月28日 10:41:19 星期三

情景:

在多次处理数组的时候, 要自定义好多个临时变量, 起名字特别麻烦

于是, 就想到利用PHP的

1.魔法方法__call

2.不定参数, 参数自动解包的特性

写了一个简单的链式操作类:

调用举例:

 1 $arr = [
 2     ['id' => 1, 'name' =>'111'],
 3     ['id' => 2, 'name' =>'222'],
 4     ['id' => 3, 'name' =>'333'],
 5     ['id' => 4, 'name' =>'333'],
 6     ['id' => 5, 'name' =>''],
 7 ];
 8 
 9 echo Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique(); // {"1":"111","2":"222","3":"333"} 调用__toString
10 Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->count()->strval()->echo(); // 3
11 Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->reset()->var_dump(); // string(3) "111"
12 Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->end()->echo(); // 333
13 var_dump(Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->empty()); //bool(false)
14 echo Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->get(1); //111
15 echo Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->get(5); //0
16 Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->json_encode()->exit(); // {"1":"111","2":"222","3":"333"}
17 Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->implode(',')->echo();
18 Data::ini('aaa^111|bbb^222|ccc^333')->explode('|')->json_encode()->echo();

 代码文件: 

 1 <?php
 2 
 3 /**
 4  * 此类的本意是链式调用PHP自带函数
 5  * 除了本类中自带的函数, 调用其它函数时需要该函数的第一个原始参数是待处理的数据($this->data)
 6  * 本类中有些函数名跟PHP自带函数一样, 需要php7以上支持(PHP7优化了词法分析器, 可以做出区分)
 7  */
 8 class Data
 9 {
10     public $data = null;
11     
12     public function __construct($data)
13     {
14         $this->data = $data;
15     }
16     
17     //没有起名为getInstance或init是因为 "ini"三个字母可以只用右手就可以敲出来
18     public static function ini($data)
19     {
20         return new Data($data);
21     }
22     
23     /*
24      * 核心代码
25      * 利用可变函数(变量函数)去隐式调用PHP自带函数
26      * 可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。
27      * http://www.php.net/manual/zh/functions.variable-functions.php
28      */
29     public function __call($func, $args) 
30     {
31         $this->data = $func($this->data, ...$args);
32         return $this;
33     }
34     
35     public function get($key, $default='0')
36     {
37         // return $this->data[$key] ?? $default;
38         return isset($this->data[$key]) ? $this->data[$key] : $default;
39     }
40     
41     public function group($key)
42     {
43         $new = array();
44         foreach ($this->data as $v) {
45             $new[$v[$key]][] = $v;
46         }
47         $this->data = $new;
48         return $this;
49     }
50     
51     public function implode($char='')
52     {
53         $this->data = implode($char, $this->data);
54         return $this;
55     }
56     
57     public function explode($char)
58     {
59         $this->data = explode($char, $this->data);
60         return $this;
61     }
62     
63     public function empty()
64     {
65         return empty($this->data);
66     }
67     
68     public function echo()
69     {
70         echo $this->data;//参数为整型时会被当作状态码返回 e.g. 200/404/500.... 浏览器无输出
71     }
72     
73     public function exit()
74     {
75         exit($this->data); //参数为整型时会被当作状态码返回 e.g. 200/404/500.... 浏览器无输出
76     }
77     
78     //echo exit 时默认调用此函数
79     public function __toString()
80     {
81         return json_encode($this->data);
82     }
83     
84 }

 

转载于:https://www.cnblogs.com/iLoveMyD/p/7088685.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git 怎么拉去分支代码_Git使用技巧1——代码写错分支了怎么办?

工欲善其事&#xff0c;必先利其器。前言Git的本质git是一个版本控制工具&#xff0c;一切以版本控制为中心&#xff0c;版本即每一次commit&#xff0c;其实分支是指向commit的&#xff0c;HEAD也是指向某一次提交的&#xff0c;HEAD其实指向的就是当前分支的最近一次commit&a…

一、MySQL基础

MySQL基础 今日目标&#xff1a; 完成MySQL的安装及登陆基本操作能通过SQL对数据库进行CRUD能通过SQL对表进行CRUD能通过SQL对数据进行CRUD 1&#xff0c;数据库相关概念 以前我们做系统&#xff0c;数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会…

struts2值栈,OGNL表达式,interceptor

struts2获取servlet api 第一种获取方式   获得原生request   HttpServletRequest request ServletActionContext.getRequest();   获得原生response   HttpServletResponse response ServletActionContext.getResponse();第二种获取方式   实现ServletRequestAwar…

如何给ppt编辑页码_拒绝千篇一律:Word插入“侧边”页码,让文档别具一格!...

微信扫码观看全套Excel、Word、PPT视频之前&#xff0c;有为大家介绍过插入页码的技法&#xff0c;你还记吗&#xff1f;(点击此处&#xff0c;阅读文章)我们已知道Word插入页码的方法&#xff0c;而且我们也很会用了。但是&#xff0c;如果要插入下图所示的侧边页码&#xff0…

二、MySQL高级

mysql高级 今日目标 掌握约束的使用 掌握表关系及建表原则 重点掌握多表查询操作 掌握事务操作 1&#xff0c;约束 上面表中可以看到表中数据存在一些问题&#xff1a; id 列一般是用标示数据的唯一性的&#xff0c;而上述表中的id为1的有三条数据&#xff0c;并且 马花疼…

设计模式之 里氏替换原则

里氏替换原则(Liskov Substitution Principle, LSP)&#xff1a;所有引用父类的地方必须能使用其子类的对象。 简单来说就是 子类拥有父类所拥有的一切&#xff0c;并可以在此基础上进而扩展其他的属性和方法。转载于:https://www.cnblogs.com/blazeZzz/p/9260874.html

sql数据库去重语法_Mysql数据库中查询重复数据和去重数据 , 删除重复数据的sql及分析...

Mysql数据库中查询重复数据和去重数据 , 删除重复数据的sql及分析发布时间&#xff1a;2018-06-17 13:22,浏览次数&#xff1a;858, 标签&#xff1a;Mysqlsql数据库中有重复数据时,用到哪些sql语句?这里有若干数据,并掺杂了重复数据1. 查看过滤重复后的数据思路, group by 分…

Maven基础(总结)——入门学习

Maven基础 一、Maven概述 1.Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;提供了一套依赖管理…

c#重写了窗体的OnKeyDown事件,但是不执行

设置下窗体的KeyPreview属性值为True即可 总结&#xff1a;遇到类似这样的问题&#xff0c;比如其他窗体运行没问题&#xff0c;就新建的窗体有问题。应该检查下窗体的属性。 转载于:https://www.cnblogs.com/codeDevotee/p/7093333.html

python答疑的作用_不学Python之集中答疑(5)

Python不用学&#xff0c;用用你就会。本辑答疑针对Python自然学习法二阶第二单元课程&#xff1a;Q&#xff1a;什么是字典&#xff1f;A&#xff1a;字典也是Python里面的一种多元素数据的存放方式。对于多个元素需要存放在一个变量名下的数据&#xff0c;Python里面常见的有…

MyBatis学习笔记(超详细总结)

MyBatis学习笔记 一、MyBatis概述 1.什么是MyBatis? MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为yBatis 。2013年11…

Docker 搭建java+tomcat

1.  准备java和tomcat的软件包 jdk-7u79-linux-x64.tar.gz apache-tomcat-7.0.57.tar.gz 2.  编辑Dockerfile 文件 vim Dockerfile 1 FROM centos  #基本镜像 2 ADD ./jdk-7u79-linux-x64.tar.gz /root  #将jdk拷贝到镜像的 /root 下 3 ADD ./apache-tomcat-7.0.57.ta…

python发邮件主机找不到_Python 使用QQ邮箱发邮件

QQ邮箱太恶心了。经常改验证方式阿福最近的脚本不能用了&#xff0c;研究了一上午。终于研究出来了。def sendmail(data):content data[content]msg MIMEText(content,_subtypeplain,_charsetutf8)msg[Subject] data[Subject]msg[From] data[From]msg[To] ;.join(data[mail…

创建并发布npm包

1.npm官网创建npm账户 npm网站地址&#xff1a;https://www.npmjs.com/ npm网站注册地址&#xff1a;https://www.npmjs.com/signup 2.命令行工具登录npm npm login 验证登录是否成功 npm who am i 3.创建npm库 npm init 按照提示输入相应内容&#xff1a; 以下为package.json内…

python 文件状态_Python:如何访问文件的状态

一、案例&#xff1a;在某些项目中&#xff0c;需要获取文件的状态文件状态&#xff1a;os.stat(path)1、文件的类型&#xff1a;普通文件、目录、符号链接、设备文件或管道(一般在Linux上)。。。2、文件的访问权限&#xff1a;一般为读、写、执行&#xff0c;3个权限&#xff…

Android 开发笔记___drawable

1 <?xml version"1.0" encoding"utf-8"?>2 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"3 android:layout_width"match_parent"4 android:layout_height"match_parent"5 …

win7 管理iphone日历_大师给你传授win7系统安装桌面日历的途径

win7正式版系统是公认操作便捷的电脑系统&#xff0c;大概很多人在操作过程中都会有应对win7系统安装桌面日历难题的时候。不少小白计算机技术还纯属于菜鸟&#xff0c;关于win7系统安装桌面日历的情况&#xff0c;不能自行处理。很多人都来询问小编win7系统安装桌面日历应该如…

Ubuntu下gcc多版本共存和版本切换

https://my.oschina.net/u/2306127/blog/538139 摘要: Ubuntu系统使用的gcc版本随着发布版本的不同而不同&#xff0c;在编译android系统时不同的版本推荐用不同的gcc去编译&#xff0c;那么可不可以改变系统的gcc来适应android编译环境的需求呢&#xff1f;答案是可以的。 Ubu…

手动导入maven项目依赖jar包

当通过坐标引入依赖jar包时&#xff0c;经常会出现下载失败或导入失败&#xff0c;需要手动去导入。 通过maven 仓库地址&#xff1a;https://mvnrepository.com/下载或其他方式拷贝的对应依赖jar包到本地。打开cmd命令窗口输入以下命令&#xff1a; mvn install:install-file…

内部属性 聚合_光的本质(用粒子性解释光的所有属性,颜色,介质内速度改变等)...

本文已经发布于《科技展望》2017年27期&#xff0c;转发请注明。1.1 光的本质1.1.1 光的本质光是地球上的生命体存在的前提条件&#xff08;当然地球上也存在不能见光的生命体&#xff0c;但即使是这些生命体不能见光&#xff0c;它们最终需要的能源也间接的来源于光&#xff0…