Java类反射应用得非常广泛几乎是所有框架的最核心部分,PHP程序员似乎从不关心反射。尝试着用java的思想去理解php的反射,跟java基本上基本一致。参考了php手册:http://www.php.net/manual/zh/book.reflection.php。
ReflectTest.php:
<?php class ReflectTest { /** * 用户ID */ private $userId; /** * 用户名 */ private $userName; /** * 用户密码 */ private $password; /** * 用户邮箱 */ private $email; /** * 用户QQ号码 */ private $qq; /** * 登陆次数 */ private $loginTimes; public function ReflectTest(){ } public function __construct($userId,$userName,$password){ $this->userId = $userId; $this->userName = $userName; $this->password = $password; } /** * * @return the $userId */ public function getUserId() { return $this->userId; } /** * * @return the $userName */ public function getUserName() { return $this->userName; } /** * * @return the $password */ public function getPassword() { return $this->password; } /** * * @return the $email */ public function getEmail() { return $this->email; } /** * * @return the $qq */ public function getQq() { return $this->qq; } /** * * @return the $loginTimes */ public function getLoginTimes() { return $this->loginTimes; } /** * * @param field_type $userId */ public function setUserId($userId) { $this->userId = $userId; } /** * * @param field_type $userName */ public function setUserName($userName) { $this->userName = $userName; } /** * * @param field_type $password */ public function setPassword($password) { $this->password = $password; } /** * * @param field_type $email */ public function setEmail($email) { $this->email = $email; } /** * * @param field_type $qq */ public function setQq($qq) { $this->qq = $qq; } /** * * @param field_type $loginTimes */ public function setLoginTimes($loginTimes) { $this->loginTimes = $loginTimes; }}?>Test.php:
<?phprequire_once "ReflectTest.php";$ref = new ReflectTest("1", "admin", "admin888");//实例化ReflectTestecho "<h1>ReflectTest init.</h1><br/>UserId:".$ref->getUserId()."<br/>UserName:".$ref->getUserName()."<br/>Password:".$ref->getPassword();$class = new ReflectionClass("ReflectTest");//反射加载ReflectTest类$instance = $class->newInstanceArgs(array("123","root","123456"));//ReflectTest初始化 echo "<h1>Field:</h1><br/>";$field = $class->getProperties();foreach($field as $f) {echo $f->getName()."<br/>";//反射输出所有的成员变量} echo "<h1>get Fields DocComment:</h1><br/>";foreach($field as $f) {$docComment = $f->getDocComment();//反射输出所有成员变量的文档注释echo $docComment."<br/>";} $method = $class->getMethods();//获取ReflectTest所有方法echo "<h1>get Methods DocComment:</h1><br/>";foreach($method as $m) {$docComment = $m->getDocComment();//获取所有方法的文档注释echo $docComment."<br/>"; } echo "<h1>get Methods:</h1><br/>";foreach($method as $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)Qq result:</h1><br/>";$qq=$class->getmethod("getQq");//获取getQq方法echo "getQQ:".$qq->invoke($instance)."<br/>";//获取成员变量qq的值echo "jb51.net";?>请求http://localhost/php/test/Test.php输出结果:
ReflectTest init. UserId:1UserName:adminPassword:admin888Field: userIduserNamepasswordemailqqloginTimesget Fields DocComment: /** * 用户ID *//** * 用户名 *//** * 用户密码 *//** * 用户邮箱 *//** * 用户QQ号码 *//** * 登陆次数 */get Methods DocComment: /** * * @return the $userId *//** * * @return the $userName *//** * * @return the $password *//** * * @return the $email *//** * * @return the $qq *//** * * @return the $loginTimes *//** * * @param field_type $userId *//** * * @param field_type $userName *//** * * @param field_type $password *//** * * @param field_type $email *//** * * @param field_type $qq *//** * * @param field_type $loginTimes */get Methods: ReflectTest=__construct=getUserId=123getUserName=rootgetPassword=123456getEmail=getQq=getLoginTimes=setUserId=setUserName=setPassword=setEmail=setQq=setLoginTimes=Invoke (set/get)Qq result: getQQ:441637262jb51.net