PHP中的reflection反射机制测试例子
Java类反射应用得非常广泛几乎是所有框架的最核心部分,PHP程序员似乎从不关心反射。尝试着用java的思想去理解php的反射,跟java基本上基本一致。参考了php手册:http://www.php.net/manual/zh/book.reflection.php。
ReflectTest.php:
<?php classReflectTest{ /** *用户ID */ private$userId; /** *用户名 */ private$userName; /** *用户密码 */ private$password; /** *用户邮箱 */ private$email; /** *用户QQ号码 */ private$qq; /** *登陆次数 */ private$loginTimes; publicfunctionReflectTest(){ } publicfunction__construct($userId,$userName,$password){ $this->userId=$userId; $this->userName=$userName; $this->password=$password; } /** * *@returnthe$userId */ publicfunctiongetUserId(){ return$this->userId; } /** * *@returnthe$userName */ publicfunctiongetUserName(){ return$this->userName; } /** * *@returnthe$password */ publicfunctiongetPassword(){ return$this->password; } /** * *@returnthe$email */ publicfunctiongetEmail(){ return$this->email; } /** * *@returnthe$qq */ publicfunctiongetQq(){ return$this->qq; } /** * *@returnthe$loginTimes */ publicfunctiongetLoginTimes(){ return$this->loginTimes; } /** * *@paramfield_type$userId */ publicfunctionsetUserId($userId){ $this->userId=$userId; } /** * *@paramfield_type$userName */ publicfunctionsetUserName($userName){ $this->userName=$userName; } /** * *@paramfield_type$password */ publicfunctionsetPassword($password){ $this->password=$password; } /** * *@paramfield_type$email */ publicfunctionsetEmail($email){ $this->email=$email; } /** * *@paramfield_type$qq */ publicfunctionsetQq($qq){ $this->qq=$qq; } /** * *@paramfield_type$loginTimes */ publicfunctionsetLoginTimes($loginTimes){ $this->loginTimes=$loginTimes; } } ?>
Test.php:
<?php require_once'ReflectTest.php'; $ref=newReflectTest("1","admin","admin888");//实例化ReflectTest echo"<h1>ReflectTestinit.</h1><br/>UserId:".$ref->getUserId()."<br/>UserName:".$ref->getUserName()."<br/>Password:".$ref->getPassword(); $class=newReflectionClass('ReflectTest');//反射加载ReflectTest类 $instance=$class->newInstanceArgs(array('123','root','123456'));//ReflectTest初始化 echo"<h1>Field:</h1><br/>"; $field=$class->getProperties(); foreach($fieldas$f){ echo$f->getName()."<br/>";//反射输出所有的成员变量 } echo"<h1>getFieldsDocComment:</h1><br/>"; foreach($fieldas$f){ $docComment=$f->getDocComment();//反射输出所有成员变量的文档注释 echo$docComment."<br/>"; } $method=$class->getMethods();//获取ReflectTest所有方法 echo"<h1>getMethodsDocComment:</h1><br/>"; foreach($methodas$m){ $docComment=$m->getDocComment();//获取所有方法的文档注释 echo$docComment."<br/>"; } echo"<h1>getMethods:</h1><br/>"; foreach($methodas$m){ $k="get";//只调ReflectTest中的所有的get方法 echo$m->getName()."=".($k===""||strpos($m->getName(),$k)===0?$m->invoke($instance):"")."<br/>"; if("setQq"==$m->getName()){ $m->invoke($instance,'441637262');//调用setQq方法为ReflectTest当中的成员变量qq设值 } } echo"<h1>Invoke(set/get)Qqresult:</h1><br/>"; $qq=$class->getmethod('getQq');//获取getQq方法 echo"getQQ:".$qq->invoke($instance)."<br/>";//获取成员变量qq的值 echo"jb51.net"; ?>
请求http://localhost/php/test/Test.php输出结果:
ReflectTestinit. UserId:1 UserName:admin Password:admin888 Field: userId userName password email qq loginTimes getFieldsDocComment: /***用户ID*/ /***用户名*/ /***用户密码*/ /***用户邮箱*/ /***用户QQ号码*/ /***登陆次数*/ getMethodsDocComment: /****@returnthe$userId*/ /****@returnthe$userName*/ /****@returnthe$password*/ /****@returnthe$email*/ /****@returnthe$qq*/ /****@returnthe$loginTimes*/ /****@paramfield_type$userId*/ /****@paramfield_type$userName*/ /****@paramfield_type$password*/ /****@paramfield_type$email*/ /****@paramfield_type$qq*/ /****@paramfield_type$loginTimes*/ getMethods: ReflectTest= __construct= getUserId=123 getUserName=root getPassword=123456 getEmail= getQq= getLoginTimes= setUserId= setUserName= setPassword= setEmail= setQq= setLoginTimes= Invoke(set/get)Qqresult: getQQ:441637262 jb51.net