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

情景:

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

于是, 就想到利用PHP的

1.魔法方法__call

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

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

调用举例:

 $arr = [
['id' => 1, 'name' =>'111'],
['id' => 2, 'name' =>'222'],
['id' => 3, 'name' =>'333'],
['id' => 4, 'name' =>'333'],
['id' => 5, 'name' =>''],
]; echo Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique(); // {"1":"111","2":"222","3":"333"} 调用__toString
Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->count()->strval()->echo(); //
Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->reset()->var_dump(); // string(3) "111"
Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->end()->echo(); //
var_dump(Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->empty()); //bool(false)
echo Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->get(1); //
echo Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->get(5); //
Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->json_encode()->exit(); // {"1":"111","2":"222","3":"333"}
Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->implode(',')->echo();
Data::ini('aaa^111|bbb^222|ccc^333')->explode('|')->json_encode()->echo();

代码文件:

 <?php

 /**
* 此类的本意是链式调用PHP自带函数
* 除了本类中自带的函数, 调用其它函数时需要该函数的第一个原始参数是待处理的数据($this->data)
* 本类中有些函数名跟PHP自带函数一样, 需要php7以上支持(PHP7优化了词法分析器, 可以做出区分)
*/
class Data
{
public $data = null; public function __construct($data)
{
$this->data = $data;
} //没有起名为getInstance或init是因为 "ini"三个字母可以只用右手就可以敲出来
public static function ini($data)
{
return new Data($data);
} /*
* 核心代码
* 利用可变函数(变量函数)去隐式调用PHP自带函数
* 可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。
* http://www.php.net/manual/zh/functions.variable-functions.php
*/
public function __call($func, $args)
{
$this->data = $func($this->data, ...$args);
return $this;
} public function get($key, $default='0')
{
// return $this->data[$key] ?? $default;
return isset($this->data[$key]) ? $this->data[$key] : $default;
} public function group($key)
{
$new = array();
foreach ($this->data as $v) {
$new[$v[$key]][] = $v;
}
$this->data = $new;
return $this;
} public function implode($char='')
{
$this->data = implode($char, $this->data);
return $this;
} public function explode($char)
{
$this->data = explode($char, $this->data);
return $this;
} public function empty()
{
return empty($this->data);
} public function echo()
{
echo $this->data;//参数为整型时会被当作状态码返回 e.g. 200/404/500.... 浏览器无输出
} public function exit()
{
exit($this->data); //参数为整型时会被当作状态码返回 e.g. 200/404/500.... 浏览器无输出
} //echo exit 时默认调用此函数
public function __toString()
{
return json_encode($this->data);
} }

php链式调用(链式操作)的更多相关文章

  1. Javascript 链式操作以及流程控制

    春节过后,感觉过年吃的油腻的食品转化的脂肪都长到 脑子去了. 根本转不动啊 上班第一天 实在是写不动代码了, 顺手打开多天为看的 收件箱,查看查看邮件,看看春节期间 风云变幻的前端圈又有哪些大事发生. ...

  2. 用php实现一个简单的链式操作

    最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen( ...

  3. 如何写 JS 的链式调用 ---》JS 设计模式《----方法的链式调用

    1.以$ 函数为例.通常返回一个HTML元素或一个元素集合. 代码如下: function $(){ var elements = []; ;i<arguments.length;i++){ v ...

  4. PHP中的__toString方法(实现JS里的链式操作)

    _toString方法是在打印对象时自动调用的魔术方法,如果不声明会报以下错 Catchable fatal error: Object of class String could not be co ...

  5. jQuery链式操作[转]

    用过jQuery的朋友都知道他强大的链式操作,方便,简洁,易于理解,如下 $("has_children").click(function(){ $(this).addClass( ...

  6. PHP链式操作输出excel(csv)

    工作中经常会遇到产品运营让导出一些简单的比较规范的数据,这时候要是有一个简单的方法可以用就简单多了.下面是我的一个输出简单的excel(csv)的方法类,用到了链式操作.说到链式操作,在jquery中 ...

  7. php类自动装载、链式操作、魔术方法

    1.自动装载实例 目录下有3个文件:index.php load.php tests文件夹 tests文件夹里有 test1.php <?php namespace Tests; class T ...

  8. PHP 设计模式 笔记与总结(4)PHP 链式操作的实现

    PHP 链式操作的实现 $db->where()->limit()->order(); 在 Common 下创建 Database.php. 链式操作最核心的地方在于:在方法的最后 ...

  9. PHP 链式操作

    所谓链式操作最简单的理解就是 操作完毕之后再返回对象$this 想必大家工作中基本都快用烂了得东西. 下面就是一个链式操作MYSQL数据库类. 最常见的链式操作 每一个方法操作之后,返回一个对象,直到 ...

随机推荐

  1. Golang入门教程(八)复合数据类型使用案例一

    目录 数组 指针 结构体(struct) 一.数组 Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定 ...

  2. svn Edge访问规则配置

    权限的配置方法: 首先在用户页面定义用户,然后在版本库页面,手工填写访问规则. 以下面的配置为例(实际配置中应删除“//”及其后的注释): [groups]               //定义用户组 ...

  3. 自学python 1.

    1.变量命名规范 1.数字,字母,下划线 2.不能数字开头和纯数字 3.要有意义 4.不要太长 5.驼峰和下划线 6.不要用中文 7.不能用关键字 8.区分大小写2.name = input(&quo ...

  4. flask 文件转为pdf并添加二维码

    背景: 宝安区需求,企业会下载表格,打印后填报.填报后收上表格,统一录入PDA.因为某台PDA只能录某个地方的表格,所以他们希望纸质表上有个二维码,扫描出现填报公司的一些信息,以及统计(好像是这样,没 ...

  5. Silverlight界面设计

    d:DesignHeight="300" d:DesignWidth="400"> 并不会限定Grid的大小,最终的效果,还要根据Grid的大小,Grid ...

  6. 【十三】jvm 性能调优工具之 jstack

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  7. mini2440串口使用

    1.安装驱动CH340-USB转串口驱动,安装完成最好重启一下电脑. 2.用串口线将开发板与pc项链,并打开电源,通过电脑设备管理器查看端口(下一步要用到). 3.运行SecureCRT.exe,并建 ...

  8. 数据库面试题之COUNT(*),COUNT(字段),CONUT(DISTINCT 字段)的区别

    COUNT(*).明确的返回数据表中的数据个数,是最准确的 COUNT(列),返回数据表中的数据个数,不统计值为null的字段 COUNT(DISTINCT 字段) 返回数据表中不重复的的数据个数,不 ...

  9. 搭建阿里云lnmp环境 (centos7+nginx+MySQL5.7.9+PHP7)

    阿里云一台服务器出现问题! 我估计是一键安装包环境的原因,所以打算重新搭建下环境! 首先,当然是先做好快照!安全第一! 对系统盘做更换系统操作,装上纯净版的centos. 装好后,进入系统 一.挂载数 ...

  10. 关于"Linux下使用Windows应用程序的尝试"总结

    首推 Flatpak .Flatpak爽啊,命令行启动能不爽吗!? 其他的: 0. AppImage:AppImage试了下,唉,启动TIM时就没反应,其他的应用没试过 1. crossover:收费 ...