關於木有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-數組我的小說靈音萬年