1. 程式人生 > >分享一個PHP處理請求引數的Trait

分享一個PHP處理請求引數的Trait

比如這樣呼叫getInput方法:
getInput('a','|b','|c[0]','|d[:date,Y-m-d H:i:s]','|e[:time]');
表示:獲取必需引數 a,可選引數b,可選引數 c 預設值為0,可選引數d,預設值使用函式date返回。


引數規則:| 表示為可選引數
[] 可選引數的預設值
: 可選引數使用函式返回,多個引數用英文逗號分隔


返回:如果必選引數不完整返回false,如果可選引數沒指定預設值返回空字串


支援restful請求

程式碼如下:

<?php
/**
 * 請求引數獲取.
 * User: zheng
 *
 *
 */
Trait Param { public function getInput(...$arg) { $reqParam = []; $reqMethod = $_SERVER['REQUEST_METHOD']; switch ($reqMethod){ case 'GET': $reqParam = $_GET; break; case 'POST': $reqParam = $_POST
; break; default: parse_str(file_get_contents('php://input'), $reqParam); break; } $reqParam = array_filter($reqParam); $returnParam = []; foreach ($arg as $val){ if(false !==strpos($val,'|')){ //是否是必選引數
$startPos = strpos($val,'|'); $endPos = strpos($val,'['); $param = $endPos?substr($val,$startPos+1,$endPos-1):substr($val,$startPos+1); if(isset($reqParam[$param])){ //引數是否請求 $returnParam[$param] = $reqParam[$param]; }else{ //獲取預設值 if($endPos){ $endRight = strpos($val,']'); $funStarPos = strpos($val,':'); if(false !== strpos($val,':')){ //是否通過函式獲取預設值 //預設值函式賦值 if(false !== strpos($val,',')){ //函式是否有引數 $paramStart = strpos($val,','); $funParam = substr($val,$paramStart+1,($endRight-($paramStart+1))); $funName = substr($val,$funStarPos+1,($paramStart-($funStarPos+1))); $arg = explode(',',$funParam); $returnParam[$param] = call_user_func_array($funName,$arg); }else{ $funName = substr($val,$funStarPos+1,($endRight-($funStarPos+1))); $returnParam[$param] = call_user_func($funName); } }else{ $returnParam[$param] = substr($val,$endPos+1,($endRight-(($endPos)+1))); } }else{ $returnParam[$param]=''; } } }else{ if(isset($reqParam[$val])){ $returnParam[$val] = $reqParam[$val]; }else{ return false; } } } return $returnParam; } } //測試 class TestGet { use Param; } $test = new TestGet(); $params = $test->getInput('a','|b','|c[0]','|d[:date,Y-m-d H:i:s]','|e[:time]'); var_dump($params); echo '<hr/>'; $params2 = $test->getInput('c'); var_dump($params2);