php反射获取函数名,3分钟短文|PHP获取函数参数名,和类定义的常量,都要反射!...

引言

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

86ed0d725360eda30ae469c3e1e2a19f.png反射

获取函数形参列表

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

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

function test($name, $age) {}

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

get_func_argNames('test');

输出类似于:

Array['name','age']

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

实现起来代码如下:

e5aad16bb46fa295b064c9537774a6d5.png

该对象提供 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 有反射这个高级语言特性的类,专门用于操作对象。

比如有下面的类:

8592bd414afbc5e7550a8d9330a14799.png

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

0f349233e4e8f6fca366f2058e2f8863.png

请问用什么办法?

许多优秀的框架在底层设计模式上,几乎绕不开那个话题——反射。我们对类的操作,也需要反射参与。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 :-)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值