分享一個PHP處理請求引數的Trait
阿新 • • 發佈:2018-12-17
比如這樣呼叫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);