PHP基于反射獲取一個(gè)類(lèi)中所有的方法
本文實(shí)例講述了PHP基于反射獲取一個(gè)類(lèi)中所有的方法。分享給大家供大家參考,具體如下:
當(dāng)我們使用一個(gè)類(lèi)時(shí)既沒(méi)有源碼也沒(méi)有文檔時(shí)(尤其是php擴(kuò)展提供的類(lèi),比如mysqli,Redis類(lèi)),我們?cè)撛趺粗肋@個(gè)類(lèi)中提供了哪些方法,以及每個(gè)方法該怎么使用呢,此時(shí)就該P(yáng)HP中強(qiáng)大的反射登場(chǎ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(); //返回類(lèi)中所有屬性 echo "--------------------props:--------------" . PHP_EOL . PHP_EOL; foreach ($props as $key => $val) { echo "$key : $val" . PHP_EOL; // 屬性名和屬性值 } $methods = $ref->getMethods(); //返回類(lèi)中所有方法 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í),我們可以對(duì)這個(gè)方法進(jìn)行進(jìn)一步的反射,以上例中的bitpos方法為例(文檔中并沒(méi)有介紹該方法的使用)
echo '---------------------params-----------------------' . PHP_EOL . PHP_EOL; $reflectMethod = $ref->getMethod('bitpos'); //傳入方法名即可 echo $reflectMethod; // 會(huì)調(diào)用$reflectMethod->__toString() 返回可打印的形式;
打印結(jié)果:
---------------------params----------------------- Method [ <internal:redis> public method bitpos ] { }
并沒(méi)有看到需要參數(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 [ <internal:mysqli> public method select_db ] { - Parameters [1] { Parameter #0 [ <required> $database ] } }
這時(shí)就沒(méi)辦法了 我們只能靠對(duì)redis的理解以及參考相似方法來(lái)使用了,比如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();
是不是很有趣呢!
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- PHP的反射動(dòng)態(tài)獲取類(lèi)方法、屬性、參數(shù)操作示例
- php面試實(shí)現(xiàn)反射注入的詳細(xì)方法
- PHP反射原理與用法深入分析
- php提供實(shí)現(xiàn)反射的方法和實(shí)例代碼
- PHP進(jìn)階學(xué)習(xí)之反射基本概念與用法分析
- php反射學(xué)習(xí)之不用new方法實(shí)例化類(lèi)操作示例
- PHP反射學(xué)習(xí)入門(mén)示例
- PHP反射實(shí)際應(yīng)用示例
- 用PHP的反射實(shí)現(xiàn)委托模式的講解
- 淺析PHP類(lèi)的反射來(lái)實(shí)現(xiàn)依賴(lài)注入過(guò)程
- PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴(lài)注入的方法詳解
- PHP反射基礎(chǔ)知識(shí)回顧
相關(guān)文章
php實(shí)現(xiàn)等比例不失真縮放上傳圖片的方法
這篇文章主要介紹了php實(shí)現(xiàn)等比例不失真縮放上傳圖片的方法,結(jié)合實(shí)例形式分析了php基于自定義函數(shù)實(shí)現(xiàn)等比例不失真縮放上傳圖片的具體功能定義與使用方法,需要的朋友可以參考下2016-11-11怎樣使用php與jquery設(shè)置和讀取cookies
有兩種處理cookies的方式—服務(wù)端(php,asp等)和客戶(hù)端(javascript).在這個(gè)教程中,我們將學(xué)習(xí)到以php和javascript這兩種方式如何去創(chuàng)建cookies2013-08-08PHP基于cookie實(shí)現(xiàn)統(tǒng)計(jì)在線(xiàn)人數(shù)功能示例
這篇文章主要介紹了PHP基于cookie實(shí)現(xiàn)統(tǒng)計(jì)在線(xiàn)人數(shù)功能,涉及php文件讀寫(xiě)、cookie訪(fǎng)問(wèn)、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2019-01-01IIS7.X配置PHP運(yùn)行環(huán)境小結(jié)
很久沒(méi)有接觸過(guò)php的東西了,今天有個(gè)程序需要一個(gè)php的運(yùn)行環(huán)境。由于只需要簡(jiǎn)單的跑一下程序,因此覺(jué)得沒(méi)有必要弄一個(gè)LAMP的環(huán)境(如果需要配LAMP環(huán)境的話(huà)可以參考我寫(xiě)的關(guān)于PHP的blog),不如直接用IIS來(lái)運(yùn)行吧。2011-06-06php獲取服務(wù)器操作系統(tǒng)相關(guān)信息的方法
這篇文章主要介紹了php獲取服務(wù)器操作系統(tǒng)相關(guān)信息的方法,涉及php針對(duì)服務(wù)器端預(yù)定義變量及系統(tǒng)函數(shù)的使用技巧,需要的朋友可以參考下2016-10-10Linux系統(tǒng)中為php添加pcntl擴(kuò)展
上篇文章我們介紹了在mac系統(tǒng)中為片php添加pcntl擴(kuò)展插件,本文我們繼續(xù)來(lái)分享下Linux系統(tǒng)中為php添加pcntl擴(kuò)展的方法,希望小伙伴們能夠喜歡2016-08-08php代碼架構(gòu)的八點(diǎn)注意事項(xiàng)
這篇文章主要介紹了php代碼架構(gòu)的八點(diǎn)注意事項(xiàng),較為全面的分析總結(jié)了基于面向?qū)ο蟪绦蛟O(shè)計(jì)的代碼架構(gòu)設(shè)計(jì)問(wèn)題相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-01-01解析crontab php自動(dòng)運(yùn)行的方法
本篇文章是對(duì)crontab php自動(dòng)運(yùn)行的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06