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

使用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. {
  6. echo "$key : $val" . PHP_EOL;
  7. }
  8. $props = $ref->getDefaultProperties(); //返回类中所有属性
  9. echo "--------------------props:--------------" . PHP_EOL . PHP_EOL;
  10. foreach ($props as $key => $val)
  11. {
  12. echo "$key : $val" . PHP_EOL; // 属性名和属性值
  13. }//phpfensi.com
  14. $methods = $ref->getMethods(); //返回类中所有方法
  15. echo "-----------------methods:---------------" . PHP_EOL . PHP_EOL;
  16. foreach ($methods as $method)
  17. {
  18. echo $method->getName() . PHP_EOL;
  19. }

返回结果:

  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. ---------------------params-----------------------
  6. Method [ <internal:mysqli> public method select_db ] {
  7. - Parameters [1] {
  8. Parameter #0 [ <required> $database ]
  9. }
  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();