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实现参数的自定义顺序调用 | 剑花烟雨江南相关推荐
- 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- R语言ggplot2可视化时避免geom_bar对x轴进行排序实战:直接对因子变量进行提前排序后再进行可视化、使用scale_x_discrete函数限定因子顺序
R语言ggplot2可视化时避免geom_bar对x轴进行排序实战:直接对因子变量进行提前排序后再进行可视化.使用scale_x_discrete函数限定因子顺序 目录
- python函数作用域包括局部变量和参数_python函数变量的作用域声明(全局变量和局部变量)...
函数变量的作用域声明(全局变量和局部变量) 引入问题: 局部变量: 局部变量:定义在函数内部的变量,它的作用域也仅限于函数内部,出了函数就不能使用了. 例如: #encoding = utf-8 de ...
- python def函数报错详解_【python】详解python函数定义 def()与参数args、可变参数*args、关键参数**args使用实例...
Python内置了很多函数,可以直接调用.Python内置的函数可以通过官方文档查看.也可以通过help()查看帮助信息.函数名是指向函数对象的引用,把函数名赋给变量,相当于给函数起了别名. 1. 定 ...
- c++构造函数以及类中变量初始化顺序
c++构造函数以及类中变量初始化顺序 Submitted by ant on Fri, 03/29/2013 - 20:05 构造函数 c++ 的类提供了一种抽象机制,使用起来要比 c 方便很多.为了 ...
- R统计绘图-corrplot热图绘制细节调整2(更改变量可视化顺序、非相关性热图绘制、添加矩形框等)
上一篇文章推送的是怎样调整corrplot热图的可视化参数,以修改字符和图例位置,数据可视化形式和字符小大和颜色等这篇是一个补充部分,记录怎样修改参数以变量排序方式和突出部分数据.本流程还是使用R统计 ...
- 7.1.3 Python进阶 《函数》定义、调用,参数,返回值《面向对象》概念,类,实例,对象,属性,方法《模块、包》导入,自定义,常用内置:datatime,time,random,os,sys
目录 ======== 第四部分 Python进阶 ======== 第一节 函数 4.1.1 函数定义及调用 4.1.2 函数的参数 4.1.3 函数的返回值 第二节 面向对象 4.2.1 面向对象 ...
- MATLAB常用命令及函数大全(字母顺序)
花了些时间把MATLAB的命令以及函数按照字母顺序列了一个清单,供大家参考. A a abs 绝对值.模.字符的ASCII码值 acos 反余弦 ...
- python函数参数定义_python函数定义中的5种参数
python函数参数定义 Python函数定义中的5种参数类型: (5 Types of Arguments in Python Function Definition:) default argum ...
最新文章
- 1)头结点,头指针,
- [原]编程融入生活---设计模式总结
- linuxl下创建mysql用户和组_Linux中用户与用户组管理
- JavaScript中encodeURI,encodeURIComponent与escape的注意
- linux里的vmware16有中文吗,vmware 16.1专业版_linux版本下载_vmware 16.1下载_5分享
- 为什么选择springcloud
- python实时监控_python实时监控cpu小工具
- 计算机与网络教育缺点,互联网安全有什么类型,缺点在何处?
- 中外多角度破题司法判决“执行难”
- android 随手记 摄像头录像
- 王道操作系统2.1.7课后习题--解答题
- 敏捷-年金、净现值NPV、IRR、现值PV、终值FV、EAR概念与案例(转)
- 空头平仓什么意思_外汇空头平仓是什么意思?外汇如何平仓?
- sim7600ce使用MQTT协议总结
- 客厅中式装修风格 温馨舒适的生活格调
- “温水煮青蛙”的实验论证
- Petalinux-conifg 错误失败
- 精选提高开发效率的15个idea插件
- JavaScript 生成唯一ID的几种方式
- 反渗透设备:反渗透纯水设备中软水器的作用及维护方法
热门文章
- Eclipse报错 due to restriction on required library C:/Java/jdk1.6.0_10/jre/lib/rt.jar 解决方案
- vsco怎么两个滤镜叠加_PS插件 VSCO滤镜137款预设安装使用教程
- AUTOSAR从入门到精通100讲(三十七)-AUTOSAR 通信服务-ComM配置及代码分析
- java对两个表进行排序_Excel工作簿中多个worksheet工作表,如何对工作表进行排序?...
- u盘插在电脑上灯亮没有反应_u盘插入电脑无反应怎么解决 u盘插入电脑无反应解决方法【步骤介绍】...
- HTML5新增的主体结构元素
- React中ref的使用方法
- 浏览器兼容问题及解决方案
- 设计模式(二)模板方法模式
- 为什么有些内联(行内)元素可以设置宽高?