首页 > 语言 > PHP > 正文

PHP基于反射获取一个类教程

2024-09-04 11:43:51
字体:
来源:转载
供稿:网友

使用PHP基于反射获取一个类也是现在很多编程人员会经常遇到的,大多数的人可能还不知道怎么通过PHP反射获取一个类,下面文章就给大家具体介绍下获取操作方法,感兴趣的一起来了解下。

当我们使用一个类时既没有源码也没有文档时(尤其是php扩展提供的类,比如mysqli,Redis类),我们该怎么知道这个类中提供了哪些方法,以及每个方法该怎么使用呢,此时就该PHP中强大的反射登场了,下面以Redis扩展为例用代码演示:

  1. $ref = new ReflectionClass('Redis'); 
  2. $consts = $ref->getConstants(); //返回所有常量名和值 
  3. echo "----------------consts:---------------" . PHP_EOL; 
  4. foreach ($consts as $key => $val
  5.   echo "$key : $val" . PHP_EOL; 
  6. $props = $ref->getDefaultProperties(); //返回类中所有属性 
  7. echo "--------------------props:--------------" . PHP_EOL . PHP_EOL; 
  8. foreach ($props as $key => $val
  9.   echo "$key : $val" . PHP_EOL;  // 属性名和属性值 
  10. }//Vevb.com 
  11. $methods = $ref->getMethods();   //返回类中所有方法 
  12. echo "-----------------methods:---------------" . PHP_EOL . PHP_EOL; 
  13. foreach ($methods as $method
  14.   echo $method->getName() . PHP_EOL; 

返回结果:

  1. ----------------consts:--------------- 
  2. REDIS_NOT_FOUND : 0 
  3. REDIS_STRING : 1 
  4. REDIS_SET : 2 
  5. REDIS_LIST : 3 
  6. REDIS_ZSET : 4 
  7. REDIS_HASH : 5 
  8. ATOMIC : 0 
  9. MULTI : 1 
  10. PIPELINE : 2 
  11. OPT_SERIALIZER : 1 
  12. OPT_PREFIX : 2 
  13. OPT_READ_TIMEOUT : 3 
  14. SERIALIZER_NONE : 0 
  15. SERIALIZER_PHP : 1 
  16. OPT_SCAN : 4 
  17. SCAN_RETRY : 1 
  18. SCAN_NORETRY : 0 
  19. AFTER : after 
  20. BEFORE : before 
  21. --------------------props:-------------- 
  22. -----------------methods:--------------- 
  23. __construct 
  24. __destruct 
  25. connect 
  26. pconnect 
  27. close 
  28. ping 
  29. echo 
  30. get 
  31. set 
  32. setex 
  33. psetex 
  34. setnx 
  35. getSet 
  36. randomKey 
  37. renameKey 
  38. renameNx 
  39. getMultiple 
  40. exists 
  41. delete 
  42. incr 
  43. incrBy 
  44. incrByFloat 
  45. decr 
  46. decrBy 
  47. type 
  48. append 
  49. getRange 
  50. setRange 
  51. getBit 
  52. setBit 
  53. strlen 
  54. getKeys 
  55. sort 
  56. sortAsc 
  57. sortAscAlpha 
  58. sortDesc 
  59. sortDescAlpha 
  60. lPush 
  61. rPush 
  62. lPushx 
  63. rPushx 
  64. lPop 
  65. rPop 
  66. blPop 
  67. brPop 
  68. lSize 
  69. lRemove 
  70. listTrim 
  71. lGet 
  72. lGetRange 
  73. lSet 
  74. lInsert 
  75. sAdd 
  76. sSize 
  77. sRemove 
  78. sMove 
  79. sPop 
  80. sRandMember 
  81. sContains 
  82. sMembers 
  83. sInter 
  84. sInterStore 
  85. sUnion 
  86. sUnionStore 
  87. sDiff 
  88. sDiffStore 
  89. setTimeout 
  90. save 
  91. bgSave 
  92. lastSave 
  93. flushDB 
  94. flushAll 
  95. dbSize 
  96. auth 
  97. ttl 
  98. pttl 
  99. persist 
  100. info 
  101. resetStat 
  102. select 
  103. move 
  104. bgrewriteaof 
  105. slaveof 
  106. object 
  107. bitop 
  108. bitcount 
  109. bitpos 
  110. mset 
  111. msetnx 
  112. rpoplpush 
  113. brpoplpush 
  114. zAdd 
  115. zDelete 
  116. zRange 
  117. zReverseRange 
  118. zRangeByScore 
  119. zRevRangeByScore 
  120. zRangeByLex 
  121. zCount 
  122. zDeleteRangeByScore 
  123. zDeleteRangeByRank 
  124. zCard 
  125. zScore 
  126. zRank 
  127. zRevRank 
  128. zInter 
  129. zUnion 
  130. zIncrBy 
  131. expireAt 
  132. pexpire 
  133. pexpireAt 
  134. hGet 
  135. hSet 
  136. hSetNx 
  137. hDel 
  138. hLen 
  139. hKeys 
  140. hVals 
  141. hGetAll 
  142. hExists 
  143. hIncrBy 
  144. hIncrByFloat 
  145. hMset 
  146. hMget 
  147. multi 
  148. discard 
  149. exec 
  150. pipeline 
  151. watch 
  152. unwatch 
  153. publish 
  154. subscribe 
  155. psubscribe 
  156. unsubscribe 
  157. punsubscribe 
  158. time 
  159. eval 
  160. evalsha 
  161. script 
  162. debug 
  163. dump 
  164. restore 
  165. migrate 
  166. getLastError 
  167. clearLastError 
  168. _prefix 
  169. _serialize 
  170. _unserialize 
  171. client 
  172. scan 
  173. hscan 
  174. zscan 
  175. sscan 
  176. pfadd 
  177. pfcount 
  178. pfmerge 
  179. getOption 
  180. setOption 
  181. config 
  182. slowlog 
  183. rawCommand 
  184. getHost 
  185. getPort 
  186. getDBNum 
  187. getTimeout 
  188. getReadTimeout 
  189. getPersistentID 
  190. getAuth 
  191. isConnected 
  192. getMode 
  193. wait 
  194. pubsub 
  195. open 
  196. popen 
  197. lLen 
  198. sGetMembers 
  199. mget 
  200. expire 
  201. zunionstore 
  202. zinterstore 
  203. zRemove 
  204. zRem 
  205. zRemoveRangeByScore 
  206. zRemRangeByScore 
  207. zRemRangeByRank 
  208. zSize 
  209. substr 
  210. rename 
  211. del 
  212. keys 
  213. lrem 
  214. ltrim 
  215. lindex 
  216. lrange 
  217. scard 
  218. srem 
  219. sismember 
  220. zrevrange 
  221. sendEcho 
  222. evaluate 
  223. evaluateSha 

进一步当我们想要知道具体一个方法怎么使用,有哪些参数时,我们可以对这个方法进行进一步的反射,以上例中的bitpos方法为例(文档中并没有介绍该方法的使用)

  1. echo '---------------------params-----------------------' . PHP_EOL . PHP_EOL; 
  2. $reflectMethod = $ref->getMethod('bitpos');  //传入方法名即可 
  3. echo $reflectMethod;  // 会调用$reflectMethod->__toString() 返回可打印的形式; 

打印结果:

---------------------params-----------------------

Method [ <internal:redis> public method bitpos ] {}

并没有看到需要参数,可能与该方法的具体实现有关,具体原因只能去看redis扩展的代码实现,正常情况下应该是返回如下的形式,以mysqli的select_db方法为例:

  1. $ref = new ReflectionClass('mysqli'); 
  2. echo '---------------------params-----------------------' . PHP_EOL . PHP_EOL; 
  3. $reflectMethod = $ref->getMethod('select_db');  //传入方法名即可 
  4. echo $reflectMethod;  // 会调用$reflectMethod->__toString() 返回可打印的形式; 
  5.  
  6. ---------------------params----------------------- 
  7. Method [ <internal:mysqli> public method select_db ] { 
  8.  - Parameters [1] { 
  9.   Parameter #0 [ <required> $database ] 
  10.  } 

这时就没办法了 我们只能靠对redis的理解以及参考相似方法来使用了,比如bitop

public function bitOp( $operation, $retKey, ...$keys) {}

贴下最终的方法调用:

  1. $redis = new Redis(); 
  2. $redis->connect('127.0.0.1'); 
  3. $redis->setBit('bit', 15, 1); 
  4. echo 'bitpos: ' . $redis->bitpos('bit', 1) . PHP_EOL; //bitpos: 15 
  5. $redis->close(); 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表