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. Cannot make a static reference to the non-static

    public class SeckillServiceImpl implements SeckillService{ private SeckillDao seckillDao; private Su ...

  2. IO流之FileUtils工具类的使用

    IO流之FileUtils工具类的使用: 使用apache的commons-io包下的FileUtils,我筛选了一些常用方法:

  3. 苹果手机上点击WEUI日期控件不容易点中

    主要问题是WEUI cells有Padding,而苹果手机一般屏幕较小,容易点不中导致的 <div class='weui_cell' style="padding-bottom:0p ...

  4. LINQ to SQL 中 Concat、Union、Intersect、Except 方法的使用

    Ø  前言 LINQ to SQL 中需要对两个或多个数据集进行操作,比如:合并.取交集等,主要使用下面四个方法,这四个方法都是 System.Linq.IQueryable<out T> ...

  5. 学习 vue 源码 -- 响应式原理

    概述 由于刚开始学习 vue 源码,而且水平有限,有理解或表述的不对的地方,还请不吝指教. vue 主要通过 Watcher.Dep 和 Observer 三个类来实现响应式视图.另外还有一个 sch ...

  6. windows下通过压缩包安装MySQL

    一.下载压缩包 二.解压缩后存放在该路径下 三.配置环境变量     将D:\Program Files\mysql-8.0.11-winx64\bin添加到用户PATH变量或系统PATH变量中   ...

  7. GCC编译器原理(一)04------GCC 工具:nlmconv、nm、objcopy、objdump和 ranlib

    1.3.13 nlmconv nlmconv 将可重定位的对象文件(Infile)转换为 NetWare 可加载模块(outfile),并可选择读取头文件信息获取 NLM 头信息. 选项,描述 -I ...

  8. Mac OSX常用工具

    换Mac有几个月了,刚换的那个月折腾了整整一个月,初用OSX很不适应,这是一种错觉,就好比说了十几年汉语,突然说英语肯定很别扭,适应后就会觉得英语更加实用. Life weiboX(http://we ...

  9. 如何修改Jupyter Notebook的主题

    1.windows系统 (1)下载到本地(使用git bash命令行界面) git clone https://github.com/dunovank/jupyter-themes (2)Instal ...

  10. 电脑丢失api-ms-win-core-libraryloader-|1-1-1.dll怎么办

    电脑从win7升级到win10,到98%的时候提示说丢失.dll,如图,我是64位系统,怎么解决这个问题呢?在脚本之家下载了 放到system32中也没有用,在线等,谢谢! 用C:\Windows\S ...