PHP-木有biggerFly 1、用匿名函数让表单数据处理变得炫酷
程序员文章站
2022-06-03 20:02:12
...
关于木有biggerFly这是木木的第一个PHP系列biggerFly翻译过来就是逼格飞~起,因为是PHP,所以这里就是驼峰命名就像名字表达的含义一样,这个系列教你怎么把PHP用得逼格飞起当然有一些也是我曾经以为逼格飞起但是结果然并卵的木木的脑洞一直都……所以,最后我会对这些代码进行一些评价,不想看木木疯的,可以跳转别的系列,传送门在末尾那么进入第一期的正题
需求
接收表单数据,格式化处理它们,然后插入数据库
模拟
假设表单提交过来的数据为
$postData = [ ['name' => 'name1', 'createtime' => '2000-01-01', 'email' => 'email1@example.com' ], ['name' => 'name2', 'createtime' => '2000-02-01', 'email' => 'email2@example.com' ], ['name' => 'name3', 'createtime' => '2000-03-01', 'email' => 'email3@example.com' ], ['name' => 'name4', 'createtime' => '2000-04-01', 'email' => 'email4@example.com' ],];
正常做法
function format( $data ) { $format = $data; $format['createtime'] = strtotime( $data['createtime'] ); return $format;}
当然上面的也可以换成引用,引用可以减少内存的开销哦~
木有biggerFly
(剧本载入中……)木木:我不想写那么多format方法,这次提交表单要写一个format,下次另一个地方也要一个format,每次都定义一个,好麻烦啊,有没有。如果还有一个验证用的validate方法,或者别的abc方法……天啊,饶了我吧biggerFly:要不试一试匿名函数?木木:哈?匿名函数是什么鬼?biggerFly:匿名函数传送门在此,走你木木:好晕,你直接告诉我,要怎么做吧……biggerFly:
class A { public $data = NULL; public $format = NULL; /** * 执行 */ public function run() { foreach ( $this->data as $key => &$data ) { if ( is_callable( $this->format ) ) { $method = $this->format;//必须赋值给一个变量,不然会报错:format方法不存在 $method( $data ); } } } /** * 设置data数组 * @param array $data */ public function setData( $data ) { $this->data = $data; return $this; } /** * 获取data数组 * @return array */ public function getData() { return $this->data; }}
木木:所以呢?怎么用biggerFly:以模拟为例子
$a = new A();$a->setData( $postData );$a->format = function( &$data ) { $data['createtime'] = strtotime( $data['createtime'] );};$a->run();var_dump( $a->getData() );
运行结果略,这里会把二维数组$postData的createtime的日期格式转化为时间戳biggerFly:通过这样的方式,只要在A类里定义一些常用的方法,就可以写不需要重复定义函数,比如一些常用的规则解释
- is_callable传送门。如果严谨一点,可以加一个is_array的判断,确保是函数
- 这样可以省去很多额外的函数定义,一些常用的比如format、validate方法直接内嵌在A类里就好了
- 同时每一个需要格式化表单数据的脚本可能就少引用了很多类,比如,如果你要检测字符串格式是不是邮箱,你可能要在每个表单处理的地方调用一个String类,有了A类,你就可以只需要一个A,把所有这种引用的写在A里就好了
- 这些处理表单数据的函数本来就是一次性的(这些format方法难道还适用别的表单数据处理咩?),所以,用匿名函数也比较符合它的含义
- 不觉得高大上咩?
其他
- 通过这样的处理,你可能还可以写出如下类似的代码,这里就不把实现写出来了,对着格式很容易就可以完成的
$a->validate = function( &$data ) {$data['email'] = array( 'email', 'unique' );$data['name'] = array( 'required', 'unique' );$data['createtime'] = array( 'datetime', function($time) { if ( strtotime( $time ) >= time() ) { return false; } else { return true; } } );};
- 匿名函数在php原生函数里经常出现,它们也被叫做回调函数,想要了解更多匿名函数,建议参考手册以及相关评论匿名函数```
传送门
往期PHP-数组我的小说灵音万年
上一篇: .user.ini文件结成的PHP后门
下一篇: html - php 获取表单数据