PHP中的reflection反射机制测试例子

这篇文章主要介绍了PHP中的reflection反射机制测试例子,从本文可以学到一些反射的使用方法,需要的朋友可以参考下。

Java类反射应用得非常广泛几乎是所有框架的最核心部分,PHP程序员似乎从不关心反射。尝试着用java的思想去理解php的反射,跟java基本上基本一致。参考了php手册:http://www.php.net/manual/zh/book.reflection.php。

ReflectTest.php:

  1. <?php
  2. class ReflectTest {
  3. /**
  4. * 用户ID
  5. */
  6. private $userId;
  7. /**
  8. * 用户名
  9. */
  10. private $userName;
  11. /**
  12. * 用户密码
  13. */
  14. private $password;
  15. /**
  16. * 用户邮箱
  17. */
  18. private $email;
  19. /**
  20. * 用户QQ号码
  21. */
  22. private $qq;
  23. /**
  24. * 登陆次数
  25. */
  26. private $loginTimes;
  27. public function ReflectTest(){
  28. }
  29. public function __construct($userId,$userName,$password){
  30. $this->userId = $userId;
  31. $this->userName = $userName;
  32. $this->password = $password;
  33. }
  34. /**
  35. *
  36. * @return the $userId
  37. */
  38. public function getUserId() {
  39. return $this->userId;
  40. }
  41. /**
  42. *
  43. * @return the $userName
  44. */
  45. public function getUserName() {
  46. return $this->userName;
  47. }
  48. /**
  49. *
  50. * @return the $password
  51. */
  52. public function getPassword() {
  53. return $this->password;
  54. }
  55. /**
  56. *
  57. * @return the $email
  58. */
  59. public function getEmail() {
  60. return $this->email;
  61. }
  62. /**
  63. *
  64. * @return the $qq
  65. */
  66. public function getQq() {
  67. return $this->qq;
  68. }
  69. /**
  70. *
  71. * @return the $loginTimes
  72. */
  73. public function getLoginTimes() {
  74. return $this->loginTimes;
  75. }
  76. /**
  77. *
  78. * @param field_type $userId
  79. */
  80. public function setUserId($userId) {
  81. $this->userId = $userId;
  82. }
  83. /**
  84. *
  85. * @param field_type $userName
  86. */
  87. public function setUserName($userName) {
  88. $this->userName = $userName;
  89. }
  90. /**
  91. *
  92. * @param field_type $password
  93. */
  94. public function setPassword($password) {
  95. $this->password = $password;
  96. }
  97. /**
  98. *
  99. * @param field_type $email
  100. */
  101. public function setEmail($email) {
  102. $this->email = $email;
  103. }
  104. /**
  105. *
  106. * @param field_type $qq
  107. */
  108. public function setQq($qq) {
  109. $this->qq = $qq;
  110. }
  111. /**
  112. *
  113. * @param field_type $loginTimes
  114. */
  115. public function setLoginTimes($loginTimes) {
  116. $this->loginTimes = $loginTimes;
  117. }
  118. }
  119. ?>

Test.php:

  1. <?php
  2. require_once 'ReflectTest.php';
  3. $ref = new ReflectTest("1", "admin", "admin888");//实例化ReflectTest
  4. echo "<h1>ReflectTest init.</h1><br/>UserId:".$ref->getUserId()."<br/>UserName:".$ref->getUserName()."<br/>Password:".$ref->getPassword();
  5. $class = new ReflectionClass('ReflectTest');//反射加载ReflectTest类
  6. $instance = $class->newInstanceArgs(array('123','root','123456'));//ReflectTest初始化
  7. echo "<h1>Field:</h1><br/>";
  8. $field = $class->getProperties();
  9. foreach($field as $f) {
  10. echo $f->getName()."<br/>";//反射输出所有的成员变量
  11. }
  12. echo "<h1>get Fields DocComment:</h1><br/>";
  13. foreach($field as $f) {
  14. $docComment = $f->getDocComment();//反射输出所有成员变量的文档注释
  15. echo $docComment."<br/>";
  16. }
  17. $method = $class->getMethods();//获取ReflectTest所有方法
  18. echo "<h1>get Methods DocComment:</h1><br/>";
  19. foreach($method as $m) {
  20. $docComment = $m->getDocComment();//获取所有方法的文档注释
  21. echo $docComment."<br/>";
  22. }
  23. echo "<h1>get Methods:</h1><br/>";
  24. foreach($method as $m) {
  25. $k = "get";//只调ReflectTest中的所有的get方法
  26. echo $m->getName()."=".($k === "" || strpos ( $m->getName (), $k ) === 0?$m->invoke($instance):"")."<br/>";
  27. if("setQq"==$m->getName()){
  28. $m->invoke($instance,'441637262');//调用setQq方法为ReflectTest当中的成员变量qq设值
  29. }
  30. }
  31. echo "<h1>Invoke (set/get)Qq result:</h1><br/>";
  32. $qq=$class->getmethod('getQq');//获取getQq方法
  33. echo "getQQ:".$qq->invoke($instance)."<br/>";//获取成员变量qq的值
  34. echo "www.phpfensi.com";
  35. ?>

请求http://localhost/php/test/Test.php输出结果:

  1. ReflectTest init.
  2. UserId:1
  3. UserName:admin
  4. Password:admin888
  5. Field:
  6. userId
  7. userName
  8. password
  9. email
  10. qq
  11. loginTimes

get Fields DocComment:

  1. /** * 用户ID */
  2. /** * 用户名 */
  3. /** * 用户密码 */
  4. /** * 用户邮箱 */
  5. /** * 用户QQ号码 */
  6. /** * 登陆次数 */
  7. get Methods DocComment:
  8. /** * * @return the $userId */
  9. /** * * @return the $userName */
  10. /** * * @return the $password */
  11. /** * * @return the $email */
  12. /** * * @return the $qq */
  13. /** * * @return the $loginTimes */
  14. /** * * @param field_type $userId */
  15. /** * * @param field_type $userName */
  16. /** * * @param field_type $password */
  17. /** * * @param field_type $email */
  18. /** * * @param field_type $qq */
  19. /** * * @param field_type $loginTimes */
  20. get Methods:
  21. ReflectTest=
  22. __construct=
  23. getUserId=123
  24. getUserName=root
  25. getPassword=123456
  26. getEmail=
  27. getQq=
  28. getLoginTimes=
  29. setUserId=
  30. setUserName=
  31. setPassword=
  32. setEmail=
  33. setQq=
  34. setLoginTimes=
  35. Invoke (set/get)Qq result: