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"} 调用__toString10 Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->count()->strval()->echo(); // 311 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(); // 33313 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); //11115 echo Data::ini($arr)->array_column('name', 'id')->array_filter()->array_unique()->get(5); //016 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 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.php28 */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 }