首先我们以添加用户为例来看两个方法:

//方法①

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实现参数的自定义顺序调用 | 剑花烟雨江南相关推荐

  1. 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  2. R语言ggplot2可视化时避免geom_bar对x轴进行排序实战:直接对因子变量进行提前排序后再进行可视化、使用scale_x_discrete函数限定因子顺序

    R语言ggplot2可视化时避免geom_bar对x轴进行排序实战:直接对因子变量进行提前排序后再进行可视化.使用scale_x_discrete函数限定因子顺序 目录

  3. python函数作用域包括局部变量和参数_python函数变量的作用域声明(全局变量和局部变量)...

    函数变量的作用域声明(全局变量和局部变量) 引入问题: 局部变量: 局部变量:定义在函数内部的变量,它的作用域也仅限于函数内部,出了函数就不能使用了. 例如: #encoding = utf-8 de ...

  4. python def函数报错详解_【python】详解python函数定义 def()与参数args、可变参数*args、关键参数**args使用实例...

    Python内置了很多函数,可以直接调用.Python内置的函数可以通过官方文档查看.也可以通过help()查看帮助信息.函数名是指向函数对象的引用,把函数名赋给变量,相当于给函数起了别名. 1. 定 ...

  5. c++构造函数以及类中变量初始化顺序

    c++构造函数以及类中变量初始化顺序 Submitted by ant on Fri, 03/29/2013 - 20:05 构造函数 c++ 的类提供了一种抽象机制,使用起来要比 c 方便很多.为了 ...

  6. R统计绘图-corrplot热图绘制细节调整2(更改变量可视化顺序、非相关性热图绘制、添加矩形框等)

    上一篇文章推送的是怎样调整corrplot热图的可视化参数,以修改字符和图例位置,数据可视化形式和字符小大和颜色等这篇是一个补充部分,记录怎样修改参数以变量排序方式和突出部分数据.本流程还是使用R统计 ...

  7. 7.1.3 Python进阶 《函数》定义、调用,参数,返回值《面向对象》概念,类,实例,对象,属性,方法《模块、包》导入,自定义,常用内置:datatime,time,random,os,sys

    目录 ======== 第四部分 Python进阶 ======== 第一节 函数 4.1.1 函数定义及调用 4.1.2 函数的参数 4.1.3 函数的返回值 第二节 面向对象 4.2.1 面向对象 ...

  8. MATLAB常用命令及函数大全(字母顺序)

    花了些时间把MATLAB的命令以及函数按照字母顺序列了一个清单,供大家参考.               A a       abs 绝对值.模.字符的ASCII码值        acos 反余弦  ...

  9. python函数参数定义_python函数定义中的5种参数

    python函数参数定义 Python函数定义中的5种参数类型: (5 Types of Arguments in Python Function Definition:) default argum ...

最新文章

  1. 1)头结点,头指针,
  2. [原]编程融入生活---设计模式总结
  3. linuxl下创建mysql用户和组_Linux中用户与用户组管理
  4. JavaScript中encodeURI,encodeURIComponent与escape的注意
  5. linux里的vmware16有中文吗,vmware 16.1专业版_linux版本下载_vmware 16.1下载_5分享
  6. 为什么选择springcloud
  7. python实时监控_python实时监控cpu小工具
  8. 计算机与网络教育缺点,互联网安全有什么类型,缺点在何处?
  9. 中外多角度破题司法判决“执行难”
  10. android 随手记 摄像头录像
  11. 王道操作系统2.1.7课后习题--解答题
  12. 敏捷-年金、净现值NPV、IRR、现值PV、终值FV、EAR概念与案例(转)
  13. 空头平仓什么意思_外汇空头平仓是什么意思?外汇如何平仓?
  14. sim7600ce使用MQTT协议总结
  15. 客厅中式装修风格 温馨舒适的生活格调
  16. “温水煮青蛙”的实验论证
  17. Petalinux-conifg 错误失败
  18. 精选提高开发效率的15个idea插件
  19. JavaScript 生成唯一ID的几种方式
  20. 反渗透设备:反渗透纯水设备中软水器的作用及维护方法

热门文章

  1. Eclipse报错 due to restriction on required library C:/Java/jdk1.6.0_10/jre/lib/rt.jar 解决方案
  2. vsco怎么两个滤镜叠加_PS插件 VSCO滤镜137款预设安装使用教程
  3. AUTOSAR从入门到精通100讲(三十七)-AUTOSAR 通信服务-ComM配置及代码分析
  4. java对两个表进行排序_Excel工作簿中多个worksheet工作表,如何对工作表进行排序?...
  5. u盘插在电脑上灯亮没有反应_u盘插入电脑无反应怎么解决 u盘插入电脑无反应解决方法【步骤介绍】...
  6. HTML5新增的主体结构元素
  7. React中ref的使用方法
  8. 浏览器兼容问题及解决方案
  9. 设计模式(二)模板方法模式
  10. 为什么有些内联(行内)元素可以设置宽高?