引言
本文我们分享两个知识点,算是PHP编程中的稍微高阶一点的用法,一般不会用到。可是有了这个思路之后,你对于自己的冗余代码,应该会有想法了。
反射获取函数形参列表
我们在写程序的时候,不可能所有功能逻辑全堆到一个方法里。总是要考虑设计方式,重用,以及功能拆分。会细分出许多的函数。
那么对于一个声明的函数,类似下面这样:
functiontest($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=pattern1=subject2=subpatterns3=flags4=offset]
结果无误。
类的常量列表
对于一个类,可能源自于多重继承。那么对于该类和继承来的所有常量,我们想要汇总为一个列表,有没有办法?
且父类有可能添加或删除了定义的常量,这个数据是动态的变化的,手动写死只能是死路一条。
还好,PHP有反射这个高级语言特性的类,专门用于操作对象。
比如有下面的类:
能否获取其常量列表,可以是下面三种方式的任意一种:
请问用什么办法?
许多优秀的框架在底层设计模式上,几乎绕不开那个话题——反射。我们对类的操作,也需要反射参与。PHP提供了ReflectionClass用于类操作。
你只需要这么写:
$refl=newReflectionClass(Profile);print_r($refl-getConstants());
输出的就是所有常量的列表,也就是这种格式:
array(Profile::LABEL_FIRST_NAME=FirstName,Profile::LABEL_LAST_NAME=LastName,Profile::LABEL_COMPANY_NAME=Company,);
完美解决,几乎不需要过多解释。
写在最后
本文提出的两个问题,和解决方法,都用到了凌驾于函数和类本身的操作。用于操作函数的类,和操作类的类。为了重用,和压缩代码量,你肯定用的着。
Happycoding:-)
我是
程序员小助手,持续分享编程知识,欢迎