php 函数变量的顺序,PHP实现参数的自定义顺序调用 | 剑花烟雨江南
首先我們以添加用戶為例來看兩個(gè)方法:
//方法①
public?function?addUser(string?$userName,?string?$userPassword,?string?$telephone,?string?$userEmail?=?'')
{
}
//方法②
public?function?addUser(array?$data)
{
}
方法①的優(yōu)點(diǎn): 通過方法的定義,就可以清楚的知道方法的參數(shù)個(gè)數(shù)以及數(shù)據(jù)類型,方便調(diào)用者使用。
缺點(diǎn): 如果參數(shù)過多,調(diào)用時(shí)會(huì)非常麻煩,而且如果默認(rèn)參數(shù)有很多,在調(diào)用時(shí), 非常容易出錯(cuò)。
方法②的優(yōu)點(diǎn): 調(diào)用者不需要按照參數(shù)的順序調(diào)用,只需要將其拼接成數(shù)組即可。
缺點(diǎn):? 調(diào)用者必須知道函數(shù)內(nèi)部,究竟需要什么參數(shù),才可以調(diào)用,增加了使用難度。
那么,可以通過什么樣的方式來使方法②轉(zhuǎn)化為方法①呢?
在之前,我們?cè)?jīng)使用過反射,來調(diào)用其他來的方法,那么可不可以通過反射的方式,得到函數(shù)的參數(shù)順序和默認(rèn)值,將方法②中的 $data 轉(zhuǎn)化為 方法①中的參數(shù)。
具體實(shí)現(xiàn):
//獲取反射類
$className?=?$this->getReflectionClass($method);
$object?=?new?\ReflectionClass($className);
//獲取構(gòu)造函數(shù)
$objectInstance?=?$object->newInstance();
$reflectionMethod?=?new?\ReflectionMethod($className,?$method);
//檢測(cè)成員方法是否存在
if?(empty($reflectionMethod))?{
return?'方法不存在';
}
//校驗(yàn)成員方法是否是public
if?(!$reflectionMethod->isPublic())?{
return?'方法不可用';
}
$parameters?=?$reflectionMethod->getParameters();//獲取所有的參數(shù)
if?(empty($parameters))?{
//無參數(shù)
return?$reflectionMethod->invoke($objectInstance);
}
$passParams?=?[];
foreach?($parameters?as?$parameter)?{
$paramName?=?$parameter->getName();
if?(isset($params[$paramName]))?{
//如果參數(shù)是數(shù)組,必須是數(shù)組
if?($parameter->isArray()?&&?!is_array($params[$paramName]))?{
return?'參數(shù)格式錯(cuò)誤';
}
$passParams[]?=?$params[$paramName];
}?else?if?($parameter->isDefaultValueAvailable())?{
//判斷是否有默認(rèn)值?取參數(shù)默認(rèn)值
$passParams[]?=?$parameter->getDefaultValue();
}?else?{
//必填參數(shù)?沒有填?返回錯(cuò)誤
return?'參數(shù)必填,沒傳';
}
}
return?$reflectionMethod->invoke($objectInstance,?...$passParams);
總結(jié)
以上是生活随笔為你收集整理的php 函数变量的顺序,PHP实现参数的自定义顺序调用 | 剑花烟雨江南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冬虫夏草烟多少钱一盒啊?
- 下一篇: php 出错处理,PHP 错误处理机制