這篇文章主要介紹了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('Redis'); $consts = $ref->getConstants();?//返回所有常量名和值 echo?"----------------consts:---------------"?.?PHP_EOL; foreach?($consts?as?$key?=>?$val) { ??echo?"$key?:?$val"?.?PHP_EOL; } $props?=?$ref->getDefaultProperties();?//返回類中所有屬性 echo?"--------------------props:--------------"?.?PHP_EOL?.?PHP_EOL; foreach?($props?as?$key?=>?$val) { ??echo?"$key?:?$val"?.?PHP_EOL;??//?屬性名和屬性值 } $methods?=?$ref->getMethods();???//返回類中所有方法 echo?"-----------------methods:---------------"?.?PHP_EOL?.?PHP_EOL; foreach?($methods?as?$method) { ??echo?$method->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->getMethod('bitpos');??//傳入方法名即可 echo?$reflectMethod;??//?會(huì)調(diào)用$reflectMethod->__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->getMethod('select_db');??//傳入方法名即可 echo?$reflectMethod;??//?會(huì)調(diào)用$reflectMethod->__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->connect('127.0.0.1'); $redis->setBit('bit',?15,?1); echo?'bitpos:?'?.?$redis->bitpos('bit',?1)?.?PHP_EOL;?//bitpos:?15 $redis->close();
是不是很有趣呢!