使用PHP基于反射獲取一個類也是現在很多編程人員會經常遇到的,大多數的人可能還不知道怎么通過PHP反射獲取一個類,下面文章就給大家具體介紹下獲取操作方法,感興趣的一起來了解下。
當我們使用一個類時既沒有源碼也沒有文檔時(尤其是php擴展提供的類,比如mysqli,Redis類),我們該怎么知道這個類中提供了哪些方法,以及每個方法該怎么使用呢,此時就該PHP中強大的反射登場了,下面以Redis擴展為例用代碼演示:
- $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; // 屬性名和屬性值
- }//Vevb.com
- $methods = $ref->getMethods(); //返回類中所有方法
- echo "-----------------methods:---------------" . PHP_EOL . PHP_EOL;
- foreach ($methods as $method)
- {
- echo $method->getName() . PHP_EOL;
- }
返回結果:
- ----------------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
進一步當我們想要知道具體一個方法怎么使用,有哪些參數時,我們可以對這個方法進行進一步的反射,以上例中的bitpos方法為例(文檔中并沒有介紹該方法的使用)
- echo '---------------------params-----------------------' . PHP_EOL . PHP_EOL;
- $reflectMethod = $ref->getMethod('bitpos'); //傳入方法名即可
- echo $reflectMethod; // 會調用$reflectMethod->__toString() 返回可打印的形式;
打印結果:
---------------------params-----------------------
Method [ <internal:redis> public method bitpos ] {}
并沒有看到需要參數,可能與該方法的具體實現有關,具體原因只能去看redis擴展的代碼實現,正常情況下應該是返回如下的形式,以mysqli的select_db方法為例:
- $ref = new ReflectionClass('mysqli');
- echo '---------------------params-----------------------' . PHP_EOL . PHP_EOL;
- $reflectMethod = $ref->getMethod('select_db'); //傳入方法名即可
- echo $reflectMethod; // 會調用$reflectMethod->__toString() 返回可打印的形式;
- ---------------------params-----------------------
- Method [ <internal:mysqli> public method select_db ] {
- - Parameters [1] {
- Parameter #0 [ <required> $database ]
- }
- }
這時就沒辦法了 我們只能靠對redis的理解以及參考相似方法來使用了,比如bitop
public function bitOp( $operation, $retKey, ...$keys) {}
貼下最終的方法調用:
- $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();
新聞熱點
疑難解答