PHP基于反射獲取一個(gè)類中所有的方法
本文實(shí)例講述了PHP基于反射獲取一個(gè)類中所有的方法。分享給大家供大家參考,具體如下:
當(dāng)我們使用一個(gè)類時(shí)既沒有源碼也沒有文檔時(shí)(尤其是php擴(kuò)展提供的類,比如mysqli,Redis類),我們?cè)撛趺粗肋@個(gè)類中提供了哪些方法,以及每個(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(); //返回類中所有屬性
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í),我們可以對(duì)這個(gè)方法進(jìn)行進(jìn)一步的反射,以上例中的bitpos方法為例(文檔中并沒有介紹該方法的使用)
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 ] {
}
并沒有看到需要參數(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í)就沒辦法了 我們只能靠對(duì)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();
是不是很有趣呢!
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- PHP的反射動(dòng)態(tài)獲取類方法、屬性、參數(shù)操作示例
- php面試實(shí)現(xiàn)反射注入的詳細(xì)方法
- PHP反射原理與用法深入分析
- php提供實(shí)現(xiàn)反射的方法和實(shí)例代碼
- PHP進(jìn)階學(xué)習(xí)之反射基本概念與用法分析
- php反射學(xué)習(xí)之不用new方法實(shí)例化類操作示例
- PHP反射學(xué)習(xí)入門示例
- PHP反射實(shí)際應(yīng)用示例
- 用PHP的反射實(shí)現(xiàn)委托模式的講解
- 淺析PHP類的反射來實(shí)現(xiàn)依賴注入過程
- PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴注入的方法詳解
- PHP反射基礎(chǔ)知識(shí)回顧
相關(guān)文章
探究Laravel使用env函數(shù)讀取環(huán)境變量為null的問題
最近在工作中遇到一個(gè)問題,不知道大家有沒有遇到過,在 Laravel中(除 app/config 目錄下的配置文件中)使用env函數(shù)讀取環(huán)境變量,有時(shí)有用,有時(shí)返回 null,這究竟怎么回事?下面通過這篇文章讓我們一探究竟。有需要的朋友們下面來一起看看吧。2016-12-12
php截取html字符串及自動(dòng)補(bǔ)全html標(biāo)簽的方法
這篇文章主要介紹了php截取html字符串及自動(dòng)補(bǔ)全html標(biāo)簽的方法,是php對(duì)html操作非常實(shí)用的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
PHP讀取ACCESS數(shù)據(jù)到MYSQL的代碼
PHP讀取ACCESS數(shù)據(jù)到MYSQL數(shù)據(jù)庫(kù)的代碼,需要的朋友可以參考下。2011-05-05
PHP callback函數(shù)使用方法和注意事項(xiàng)
這篇文章主要介紹了PHP callback函數(shù)使用方法和注意事項(xiàng),本文講解了callback函數(shù)的一些使用技巧和避免事項(xiàng),并給出了一個(gè)使用實(shí)例,需要的朋友可以參考下2015-01-01
php腳本守護(hù)進(jìn)程原理與實(shí)現(xiàn)方法詳解
這篇文章主要介紹了php腳本守護(hù)進(jìn)程原理與實(shí)現(xiàn)方法,較為詳細(xì)的分析了php腳本守護(hù)進(jìn)程的實(shí)現(xiàn)思路、原理、格式及具體實(shí)現(xiàn)方法,需要的朋友可以參考下2017-07-07
phplock(php進(jìn)程鎖) v1.0 beta1
PHP在多進(jìn)程模式下(并發(fā)的web訪問)由于沒有內(nèi)置的鎖支持,在處理一些資源的之后,很容易出現(xiàn)并發(fā)性問題。2009-11-11

