php中反射如何獲取一個(gè)類中的方法詳解

這篇文章主要介紹了php基于反射獲取一個(gè)類中所有的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了php使用反射機(jī)制獲取類中所有屬性與方法的操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了PHP基于反射獲取一個(gè)類中所有的方法。分享給大家供大家參考,具體如下:

當(dāng)我們使用一個(gè)類時(shí)既沒有源碼也沒有文檔時(shí)(尤其是php擴(kuò)展提供的類,比如mysqli,Redis類),我們該怎么知道這個(gè)類中提供了哪些方法,以及每個(gè)方法該怎么使用呢,此時(shí)就該P(yáng)HP中強(qiáng)大的反射登場了,下面以Redis擴(kuò)展為例用代碼演示:

<?php $ref = new ReflectionClass(&#39;Redis&#39;);  $consts = $ref->getConstants();?//返回所有常量名和值  echo?"----------------consts:---------------"?.?PHP_EOL;  foreach?($consts?as?$key?=&gt;?$val)  {  ??echo?"$key?:?$val"?.?PHP_EOL;  }  $props?=?$ref-&gt;getDefaultProperties();?//返回類中所有屬性  echo?"--------------------props:--------------"?.?PHP_EOL?.?PHP_EOL;  foreach?($props?as?$key?=&gt;?$val)  {  ??echo?"$key?:?$val"?.?PHP_EOL;??//?屬性名和屬性值  }  $methods?=?$ref-&gt;getMethods();???//返回類中所有方法  echo?"-----------------methods:---------------"?.?PHP_EOL?.?PHP_EOL;  foreach?($methods?as?$method)  {  ??echo?$method-&gt;getName()?.?PHP_EOL;  }

返回結(jié)果:

----------------consts:---------------  REDIS_NOT_FOUND?:?0  REDIS_STRING?:?1  REDIS_SET?:?2  REDIS_LIST?:?3  REDIS_ZSET?:?4  REDIS_HASH?:?5  ATOMIC?:?0  MULTI?:?1  PIPELINE?:?2  OPT_SERIALIZER?:?1  OPT_PREFIX?:?2  OPT_READ_TIMEOUT?:?3  SERIALIZER_NONE?:?0  SERIALIZER_PHP?:?1  OPT_SCAN?:?4  SCAN_RETRY?:?1  SCAN_NORETRY?:?0  AFTER?:?after  BEFORE?:?before  --------------------props:--------------  -----------------methods:---------------  __construct  __destruct  connect  pconnect  close  ping  echo  get  set  setex  psetex  setnx  getSet  randomKey  renameKey  renameNx  getMultiple  exists  delete  incr  incrBy  incrByFloat  decr  decrBy  type  append  getRange  setRange  getBit  setBit  strlen  getKeys  sort  sortAsc  sortAscAlpha  sortDesc  sortDescAlpha  lPush  rPush  lPushx  rPushx  lPop  rPop  blPop  brPop  lSize  lRemove  listTrim  lGet  lGetRange  lSet  lInsert  sAdd  sSize  sRemove  sMove  sPop  sRandMember  sContains  sMembers  sInter  sInterStore  sUnion  sUnionStore  sDiff  sDiffStore  setTimeout  save  bgSave  lastSave  flushDB  flushAll  dbSize  auth  ttl  pttl  persist  info  resetStat  select  move  bgrewriteaof  slaveof  object  bitop  bitcount  bitpos  mset  msetnx  rpoplpush  brpoplpush  zAdd  zDelete  zRange  zReverseRange  zRangeByScore  zRevRangeByScore  zRangeByLex  zCount  zDeleteRangeByScore  zDeleteRangeByRank  zCard  zScore  zRank  zRevRank  zInter  zUnion  zIncrBy  expireAt  pexpire  pexpireAt  hGet  hSet  hSetNx  hDel  hLen  hKeys  hVals  hGetAll  hExists  hIncrBy  hIncrByFloat  hMset  hMget  multi  discard  exec  pipeline  watch  unwatch  publish  subscribe  psubscribe  unsubscribe  punsubscribe  time  eval  evalsha  script  debug  dump  restore  migrate  getLastError  clearLastError  _prefix  _serialize  _unserialize  client  scan  hscan  zscan  sscan  pfadd  pfcount  pfmerge  getOption  setOption  config  slowlog  rawCommand  getHost  getPort  getDBNum  getTimeout  getReadTimeout  getPersistentID  getAuth  isConnected  getMode  wait  pubsub  open  popen  lLen  sGetMembers  mget  expire  zunionstore  zinterstore  zRemove  zRem  zRemoveRangeByScore  zRemRangeByScore  zRemRangeByRank  zSize  substr  rename  del  keys  lrem  ltrim  lindex  lrange  scard  srem  sismember  zrevrange  sendEcho  evaluate  evaluateSha

進(jìn)一步當(dāng)我們想要知道具體一個(gè)方法怎么使用,有哪些參數(shù)時(shí),我們可以對這個(gè)方法進(jìn)行進(jìn)一步的反射,以上例中的bitpos方法為例(文檔中并沒有介紹該方法的使用)

立即學(xué)習(xí)PHP免費(fèi)學(xué)習(xí)筆記(深入)”;

echo?'---------------------params-----------------------'?.?PHP_EOL?.?PHP_EOL;  $reflectMethod?=?$ref-&gt;getMethod('bitpos');??//傳入方法名即可  echo?$reflectMethod;??//?會(huì)調(diào)用$reflectMethod-&gt;__toString()?返回可打印的形式;

打印結(jié)果:

---------------------params-----------------------  Method?[?<redis>?public?method?bitpos?]?{  }</redis>

并沒有看到需要參數(shù),可能與該方法的具體實(shí)現(xiàn)有關(guān),具體原因只能去看redis擴(kuò)展的代碼實(shí)現(xiàn),正常情況下應(yīng)該是返回如下的形式,以mysqli的select_db方法為例:

$ref?=?new?ReflectionClass('mysqli');  echo?'---------------------params-----------------------'?.?PHP_EOL?.?PHP_EOL;  $reflectMethod?=?$ref-&gt;getMethod('select_db');??//傳入方法名即可  echo?$reflectMethod;??//?會(huì)調(diào)用$reflectMethod-&gt;__toString()?返回可打印的形式;

---------------------params-----------------------  Method?[?<mysqli>?public?method?select_db?]?{  ?-?Parameters?[1]?{  ??Parameter?#0?[?<required>?$database?]  ?}  }</required></mysqli>

這時(shí)就沒辦法了 我們只能靠對redis的理解以及參考相似方法來使用了,比如bitop

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

貼下最終的方法調(diào)用

$redis?=?new?Redis();  $redis-&gt;connect('127.0.0.1');  $redis-&gt;setBit('bit',?15,?1);  echo?'bitpos:?'?.?$redis-&gt;bitpos('bit',?1)?.?PHP_EOL;?//bitpos:?15  $redis-&gt;close();

是不是很有趣呢!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊13 分享