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