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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件信息修改大师_零成本学习之单片机硬件开发(1)

从今天开始给大家逐步讲解单片机编程,有兴趣的小伙伴们,可以关注本课程,完全免费本人从事从2004年大学毕业开始从事开发工作,先后做过单片机开发、ucOSII开发、手机开发、android APP开发、PHP开发、微信小程序开发,目…

RotateDrawable

用来对Drawable进行旋转,也是通过setLevel来控制旋转的,最大值也是:10000 相关属性如下: fromDegrees:起始的角度,,对应最低的level值,默认为0toDegrees:结束角度,对应最高的level值,默认360pivotX:设置参照点的x坐标,取值为0~1,默认是50%,即0.5pivotY:设置参照点的…

ionic3 自动创建启动背景splash以及图标icon

在新建的项目文件夹下的 resources下就是我们放置图标以及启动背景图片的位置了。 如果现在我们想生成自己的图片的启动背景以及图片,我们需要把resources下的 icon.png 以及splash.png 替换为我们的图片。 icon 图片最好为1024x1024像素 splash 图片最好为2732x2…

Spring容器的简单实现(IOC原理)

引言:容器是什么?什么是容器?Spring容器又是啥东西?我给Spring容器一个对象名字,为啥能给我创建一个对象呢? 一、容器是装东西的,就像你家的水缸,你吃饭的碗等等。 java中能作为容器…

Java:安排作业按时间间隔运行

最近,我花了一些时间围绕Neo4j版本之间的滚动升级构建了一组测试,作为其中的一部分,我想记录升级发生时的群集状态。 测试的主线程会等待升级完成,因此我想每隔几秒钟登录另一个线程。 Alistair向我指出了ScheduledExecutorServi…

epic怎么添加本地游戏_游戏日报:原神公测无法上架多家安卓渠道;Epic投资布局游戏UGC平台...

// 热点标签/// NOCITCE华为|小米|OPPO|米哈游|腾讯|莉莉丝B站|阅文集团|Epic|万国觉醒|灰烬战线FGO|怪物弹珠|勇者斗恶龙|金币大师阴阳师|和平精英|王者荣耀|三国志战略版1.华为、小米、OPPO等多家安卓渠道的《原神》版主发布公告称,因开发者要求/未与米哈游达成一…

php 出错处理,PHP 错误处理机制

在日常的项目开发过程中,总是会出现一些我们意想不到的异常错误,如果我们对此没有进行相对完善的处理,那么程序看上去也很不专业,也很可能就会成为别人攻击系统的有效信息;有些错误异常会终止脚本执行,这个…

根据location地址,在导航栏高亮显示当前页面

获取当前页面的地址栏。与导航栏中所有<a> 标签的href属性 进行比较。如果相等则高亮显示 此<a>标签。 注意点&#xff1a;a 标签的href 属性在浏览器解析时 是绝对路径。 a 标签的href 如果是锚点&#xff0c;则 pathname &#xff0c; href都与 location的 pathn…

解决关于 ionic3 启动白屏 控制台错误提示:Uncaught SyntaxError Use of const in strict mode.

今天将项目从ionic2 升级为ionic3 &#xff0c;ionic serve 运行在网页上无任何错误。 但是将项目打包成为android apk 却一直卡在启动页面 白屏&#xff0c;进不去的情况。后来在android studio 控制台看到这个错误提示&#xff1a;Uncaught SyntaxError Use of const in str…

参数与超参数

作为机器学习攻城狮&#xff08;咳咳&#xff1a;调参员&#xff09;&#xff0c;参数和超参数是最最基础的常识。 1、参数&#xff08;模型根据数据可以自动学习出的变量&#xff09; 参数指的是模型内部的配置变量(configuration variable)&#xff0c;可通过数据来估计其取值…

使用structure101分析软件包的依赖关系

稳定应用程序的一个关键是结构良好的代码库。 我们知道我们应该建立尽可能多的黑匣子&#xff0c;因为一旦完成一个黑匣子&#xff0c;我们就不必再考虑它的内部了。 您只需要使用您或其他团队成员通过明确定义的界面编写的代码即可。 这使您可以专注于要添加的下一个功能。 当…

excel高级筛选怎么用_神!Excel高级筛选原来如此好用

转自EXCE不加班这两天的宏教程都提到了高级筛选这个功能&#xff0c;不过只是用到最基本的用法。高级筛选其实是一个很好用的功能&#xff0c;今天卢子来全面讲解。1.按关键词筛选高级筛选最重要的就是条件区域&#xff0c;资产名称四门书柜&#xff0c;日期2017/1/1&#xff0…

iis7.5配置php环境,iis7.5安装配置php环境 - iis

前言iis7.5是安装在win7、win8里的web服务器&#xff0c;win2003、win2000的web服务器使用的是iis6.0&#xff0c;由于win7、win8系统相比win2003、win2000有了改新革面的不同&#xff0c;因此对于iis7.5的配置也必需捣鼓一翻才能熟悉。不过...前言iis7.5是安装在win7、win8里的…

微信小程序 网络请求之设置合法域名

设置域名 登录微信公众号后台小程序中 设置→开发设置→服务器设置 必须设置域名&#xff0c;微信小程序才能进行网络通讯&#xff0c;不然会报错 如果设置好了合法域名&#xff0c;开发工具还提示不在合法域名列表中&#xff0c;因为在微信会有一段时间的缓存&#xff0c;等…

money (dp)

牛客网暑假训练第二场D题&#xff1a; 链接&#xff1a;https://www.nowcoder.com/acm/contest/140/D来源&#xff1a;牛客网 题目描述 White Cloud has built n stores numbered from 1 to n. White Rabbit wants to visit these stores in the order from 1 to n. The store …

简而言之Java.io:22个案例研究

这篇文章试图涵盖java.io中的一整套操作。 与与此主题相关的其他书籍和博客相比&#xff0c;我的动机是通过案例研究展示“操作方法”。 作为一名Java的学生&#xff0c;我意识到学习一种新的程序语言的最有效方法是通过示例&#xff1a;复制并粘贴一段代码&#xff0c;运行它以…

php gps 坐标,php 计算gps坐标 距离

在计算机或GPS上经纬度经常用度、分、秒和度.度、分.分、秒.秒的混合方式进行表示&#xff0c;度、分、秒间的进 制是60进制&#xff0c;度.度、分.分、秒.秒的进制是100进制&#xff0c;换算时一定要注意。可以近似地认为每个纬度之间的距离是不变的111KM,每分间 1.85KM&#…

博客园如何使用MarkDown

如何使用博客园下的markdown&#xff1a;https://www.cnblogs.com/ulrica/p/8933549.html 博客园的 MarkDown 代码样式如何设置https://www.cnblogs.com/zhongxia/p/26b4b061f2a47518681bcdd4ff89c344.html 博客园 Markdown 编辑器指南http://www.cnblogs.com/qiaogaojian/p/61…

jQuery -- 光阴似箭(五):AJAX 方法

jQuery -- 知识点回顾篇&#xff08;五&#xff09;&#xff1a;AJAX 方法 1. $.ajax 方法&#xff1a;用于执行 AJAX&#xff08;异步 HTTP&#xff09;请求。 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"t…

ggplot2设置坐标轴范围_R语言数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()...

【R语言】高维数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()姐妹花​mp.weixin.qq.comfacet_grid()形成由行和列面化变量定义的面板矩阵。当有两个离散变量&#xff0c;并且这些变量的所有组合存在于数据中时&#xff0c;它是最有用的。如果只有一个具有多个…