PHP反射类 ReflectionClass
最近碰到一个PHP反射类函数ReflectionClass,发现其功能很多,非常好用,下面做下总结。
什么是PHP反射类,字面上可以简单的理解为一个类的映射。官方文档给出的解释是,ReflectionClass 类报告了一个类的有关信息。什么鬼?解释后还是感觉有点抽象。看到一个更通俗的解释,反射返回的对象类(class)的元数据对象(包含class的所有属性/方法的元数据信息),但不是该类本身;类似于查到了类的户口档案,但户口档案不是类本身!如果还是有点抽象,直接看例子会好点:
class member_service { const TYPE_ADMIN = 1; const TYPE_REGISTER = 2; const TYPE_TOURIST = 3; private $age = 21; public $name = 'jack'; private function fun1() { echo "这是一个私有函数!"; } public function fun2() { echo "这是个公共函数!"; } }
然后创建一个member_service反射类:
$class = new ReflectionClass('member_service');
如果你想获取反射类中的某个常量,可以调用反射类方法:public mixed getConstant ( string $name ),比如:
//获取TYPE_REGISTER这个常量的值 echo $class-> getConstant('TYPE_REGISTER'); //输出2
如果你想获取反射类中全部常量的值,可以调用反射类方法:public array getConstants ( void ),该方法以数组的形式返回全部常量的值,比如:
print_r($class-> getConstants()); //输出结果 /* Array ( [TYPE_ADMIN] => 1 [TYPE_REGISTER] => 2 [TYPE_TOURIST] => 3 ) */
如果想获得反射类属性,可以使用:public array getDefaultProperties ( void ),该反射类方法以数组键值对的形式返回,比如:
print_r($class->getDefaultProperties()); /*输出结果: Array ( [age] => 21 [name] => jack ) */
如果想获得反射类下面的某个具体方法,可以使用:public ReflectionMethod getMethod ( string $name ),比如:
echo $class->getMethod('fun1'); /*输出结果: Method [private method fun1 ] { @@ /usercode/file.php 16 - 18 } */
如果想获得反射类下面的所有方法,可以使用:public array getMethods ([ int $filter ] ),将以数组的形式返回结果,比如:
print_r($class->getMethods()); /*输出结果 Array ( [0] => ReflectionMethod Object ( [name] => __construct [class] => member_service ) [1] => ReflectionMethod Object ( [name] => fun1 [class] => member_service ) [2] => ReflectionMethod Object ( [name] => fun2 [class] => member_service ) )*/
如果想根据反射类,生成具体类实例,可以使用:public object newInstance ( mixed $args [, mixed $… ] )或者使用
public object newInstanceArgs ([ array $args ] ),比如:
//相当于实例化 member_service 类 $new_instance = $class->newInstance(); var_dump($new_instance); /*上面输出: object(member_service)#2 (2) { ["age":"member_service":private]=> int(21) ["name"]=> string(4) "jack" } */
可以对生成的实例类进行方法调用,和new生成类时调用方法一致,比如:
$new_instance->fun2(); $new_instance->fun1(); /*上面输出: 这是个公共函数!PHP Fatal error: Call to private method member_service::fun1() from context '' in /usercode/file.php on line 32 */
和new一样,实例化的类不能调用私有方法和属性。
关于反射类的方法还有很多,更多的方法可以参考官方文档:http://www.php.net/manual/zh/class.reflectionclass.php。