引言

本文我们分享两个知识点,算是PHP编程中的稍微高阶一点的用法,一般不会用到。可是有了这个思路之后,你对于自己的冗余代码,应该会有想法了。

获取函数形参列表

我们在写程序的时候,不可能所有功能逻辑全堆到一个方法里。总是要考虑设计方式,重用,以及功能拆分。会细分出许多的函数。

那么对于一个声明的函数,类似下面这样:

function test($name, $age) {}

是否有这样的函数,可以直接获取到 test 函数的传参名呢?

get_func_argNames('test');

输出类似于:

Array['name','age']

能做到吗?PHP有这样的现成函数吗?很遗憾,没有!我们需要手动造出来,需要使用一个对象——函数反射 ReflectionFunction。

实现起来代码如下:

该对象提供 getParameters 方法,返回一个形参列表。使用的之后直接用就是:

print_r(get_func_argNames('get_func_argNames'));

输出参数数组:

Array(    [0] => funcName)

注意,上述方法返回的是全局有效的函数的参数列表,而对于类方法,则需要 ReflectionClass 提供支持了。

验证是否正确,我们获取 preg_match 函数的参数列表,输出如下:

array:5 [  0 => "pattern"  1 => "subject"  2 => "subpatterns"  3 => "flags"  4 => "offset"]

结果无误。

类的常量列表

对于一个类,可能源自于多重继承。那么对于该类和继承来的所有常量,我们想要汇总为一个列表,有没有办法?

且父类有可能添加或删除了定义的常量,这个数据是动态的变化的,手动写死只能是死路一条。

还好,PHP 有反射这个高级语言特性的类,专门用于操作对象。

比如有下面的类:

能否获取其常量列表,可以是下面三种方式的任意一种:

请问用什么办法?

许多优秀的框架在底层设计模式上,几乎绕不开那个话题——反射。我们对类的操作,也需要反射参与。PHP 提供了 ReflectionClass 用于类操作。

你只需要这么写:

$refl = new ReflectionClass('Profile');print_r($refl->getConstants());

输出的就是所有常量的列表,也就是这种格式:

array(    'Profile::LABEL_FIRST_NAME'   => 'First Name',    'Profile::LABEL_LAST_NAME'    => 'Last Name',    'Profile::LABEL_COMPANY_NAME' => 'Company',);

完美解决,几乎不需要过多解释。

写在最后

本文提出的两个问题,和解决方法,都用到了凌驾于函数和类本身的操作。用于操作函数的类,和操作类的类。为了重用,和压缩代码量,你肯定用的着。

Happy coding :-)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

php定义一个学生类_3分钟短文 | PHP获取函数参数名,和类定义的常量,都要反射...相关推荐

  1. php 时间格式化_3分钟短文 | PHP获取函数的代码片段,唯有反射最高效

    引言 为了演示上一篇我们所说的PHP中反射的应用,本篇接着讲反射的应用.因为其特性,是操作函数和方法的,是函数的操作者,类的操作者,所以显得格外重要. 我们从一个小需求出发,假如有一段这样的代码: f ...

  2. JAVA入门级教学之(定义一个学生类)

    首先定义一个学生类          学生类是一个模板,里面描述了学生的共同特征[状态+行为] 当前类只描述学生的状态信息[属性] Student是类,属于引用数据类型,这个类型名就是:Student ...

  3. python创建学生类姓名学号_定义一个学生类,包含学号、姓名、平时成绩和考核成绩四个数据成员和以下成员方法(用Python语言):...

    定义一个学生类,包含学号.姓名.平时成绩和考核成绩四个数据成员和以下成员方法(用Python语言):Python实验题目:类与文件实验要求:1.定义类2.定义并使用类对象3.打开和存取文件... 定义 ...

  4. 定义一个学生类Student,包含三个属性姓名、年龄、性别, 创建三个学生对象存入ArrayList集合中。 A:使用迭代器遍历集合。 B:求出年龄最大的学生,然后将该对象的姓名变为:小猪佩奇。

    Java基础 定义一个学生类Student,包含三个属性姓名.年龄.性别, 创建三个学生对象存入ArrayList集合中. A:使用迭代器遍历集合. B:求出年龄最大的学生,然后将该对象的姓名变为:小 ...

  5. Java——(1)定义一个学生类Student,包含属性:姓名(String name)、年龄(int age) (2)定义Map集合,用Student对象作为key

    分析以下需求,并用代码实现: (1)定义一个学生类Student,包含属性:姓名(String name).年龄(int age) (2)定义Map集合,用Student对象作为key,用字符串(此表 ...

  6. python定义一个学生类姓名、年龄、性别、成绩、你成绩评价_.定义一个学生类Student,包含三个属性姓名、年龄、性别,创建三个学生对象存入ArrayList集合中。...

    3.定义一个学生类Student,包含三个属性姓名.年龄.性别,创建三个学生对象存入ArrayList集合中. A:遍历集合遍历输出. B:求出年龄最大的学生,让后将该对象的姓名变为:王者荣耀. pa ...

  7. 【水汐のC#】计一个Windows应用程序,在该程序中定义一个学生类和班级类,以处理学生的学号,姓名,语文,数学和英语3门课程的期末考试成绩。实现如下要求的功能:

    设计一个Windows应用程序,在该程序中定义一个学生类和班级类,以处理学生的学号,姓名,语文,数学和英语3门课程的期末考试成绩.实现如下要求的功能: 根据姓名查询该学生的总成绩: 统计全班学生总分的 ...

  8. python中定义一个学生类_python3 class类 练习题

    """ 一.定义一个学生Student类.有下面的类属性: 1 姓名 name 2 年龄 age 3 成绩 score(语文,数学,英语) [每课成绩的类型为整数] 类方 ...

  9. 以小组为单位,设计一个Windows应用程序,在该程序中定义一个学生类和班级类,以处理学生的学号,姓名,语文,数学和英语3门课程的期末考试成绩。

    设计一个Windows应用程序,在该程序中定义一个学生类和班级类,以处理学生的学号,姓名,语文,数学和英语3门课程的期末考试成绩. 实现如下要求的功能: 1.根据姓名查询该学生的总成绩: 2.统计全班 ...

最新文章

  1. 带你从源码角度分析ViewGroup中事件分发流程
  2. 网络运维工作是什么的?
  3. Linux yum包管理工具常用命令示例
  4. maven 报错一站式解决方案
  5. LeetCode: Maximum Subarray 解题报告
  6. android7.x版本编译framework.jar无效解决
  7. 【转载】Android S5PV210 fimc驱动分析 - fimc_regs.c
  8. 经典C语言编程100例——题目+答案代码(完结)
  9. 如何反编译微信小程序前端,30分钟教你学会
  10. Intellij IDEA之Mybatis插件:Free Mybatis Plugin
  11. 安装linux ubuntu11系统时,应该如何选择键盘布局,在ubuntu上创建新键盘布局需要哪些步骤?...
  12. 服务器 异常自动关机,服务器自动关机常见问题
  13. 使用uigi将英雄小头像显示在详细资料中(图片切换)
  14. 车载前置摄像头学习笔记 ———— 摄像头输出数据格式(JPEG)
  15. 【威胁通告】攻击者利用漏洞攻击Edimax WiFi桥接器
  16. ios 倒数器_如何利用ps绘制IOS7风格的倒数计时器
  17. python中的与或非 | ^
  18. token放在cookie中和放在请求头中的区别
  19. 申请计算机专业有关个人陈述吗,计算机研究生申请个人陈述范文分享
  20. 离线数仓模型构建的简单见解

热门文章

  1. Web存储—sessionStorage存储
  2. 【Express】—post传递参数
  3. HDMIARC是什么
  4. 在河北大学就读是怎样一种体验?
  5. 如何通过改造休闲旅行车赚到1000万元?
  6. 一个真正容易成大事的人,大多都熬过这4种苦,看看你熬过几种?
  7. 那些月入1万的自媒体大咖,惯用的4个爆款选题分享给你
  8. 为何你写的文案打不动不了人心?
  9. 不小心执行了rm-rf,除了跑路,如何恢复?
  10. 网站做好后,不想买服务器可以用自己的电脑当服务器么?