首页 > 编程 > PHP > 正文

php中反射如何获取一个类中的方法详解

2020-03-22 16:27:16
字体:
来源:转载
供稿:网友
这篇文章主要介绍了PHP基于反射获取一个类中所有的方法,结合实例形式较为详细的分析了php使用反射机制获取类中所有属性与方法的操作步骤与相关注意事项,需要的朋友可以参考下

本文实例讲述了PHP基于反射获取一个类中所有的方法。分享给大家供大家参考,具体如下:

当我们使用一个类时既没有源码也没有文档时(尤其是php扩展提供的类,比如mysqli,Redis类),我们该怎么知道这个类中提供了哪些方法,以及每个方法该怎么使用呢,此时就该PHP中强大的反射登场了,下面以Redis扩展为例用代码演示:


 ?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;}

返回结果:


----------------consts:---------------REDIS_NOT_FOUND : 0REDIS_STRING : 1REDIS_SET : 2REDIS_LIST : 3REDIS_ZSET : 4REDIS_HASH : 5ATOMIC : 0MULTI : 1PIPELINE : 2OPT_SERIALIZER : 1OPT_PREFIX : 2OPT_READ_TIMEOUT : 3SERIALIZER_NONE : 0SERIALIZER_PHP : 1OPT_SCAN : 4SCAN_RETRY : 1SCAN_NORETRY : 0AFTER : afterBEFORE : before--------------------props:-------------------------------methods:---------------__construct__destructconnectpconnectclosesetexpsetexsetnxgetSetrandomKeyrenameKeyrenameNxgetMultipleexistsdeleteincrByincrByFloatdecrByappendgetRangesetRangegetBitsetBitstrlengetKeyssortAscsortAscAlphasortDescsortDescAlphalPushrPushlPushxrPushxblPopbrPoplSizelRemovelistTrimlGetRangelInsertsSizesRemovesMovesRandMembersContainssMemberssIntersInterStoresUnionsUnionStoresDiffsDiffStoresetTimeoutbgSavelastSaveflushDBflushAlldbSizepersistresetStatselectbgrewriteaofslaveofobjectbitopbitcountbitposmsetnxrpoplpushbrpoplpushzDeletezRangezReverseRangezRangeByScorezRevRangeByScorezRangeByLexzCountzDeleteRangeByScorezDeleteRangeByRankzCardzScorezRankzRevRankzInterzUnionzIncrByexpireAtpexpirepexpireAthSetNxhKeyshValshGetAllhExistshIncrByhIncrByFloathMsethMgetmultidiscardpipelinewatchunwatchpublishsubscribepsubscribeunsubscribepunsubscribeevalshascriptdebugrestoremigrategetLastErrorclearLastError_prefix_serialize_unserializeclienthscanzscansscanpfaddpfcountpfmergegetOptionsetOptionconfigslowlograwCommandgetHostgetPortgetDBNumgetTimeoutgetReadTimeoutgetPersistentIDgetAuthisConnectedgetModepubsubpopensGetMembersexpirezunionstorezinterstorezRemovezRemoveRangeByScorezRemRangeByScorezRemRangeByRankzSizesubstrrenameltrimlindexlrangescardsismemberzrevrangesendEchoevaluateevaluateSha

进一步当我们想要知道具体一个方法怎么使用,有哪些参数时,我们可以对这个方法进行进一步的反射,以上例中的bitpos方法为例(文档中并没有介绍该方法的使用)


echo ---------------------params----------------------- . PHP_EOL . PHP_EOL;$reflectMethod = $ref- getMethod( bitpos //传入方法名即可echo $reflectMethod; // 会调用$reflectMethod- __toString() 返回可打印的形式;

打印结果:


---------------------params-----------------------Method [ internal:redis html' target='_blank'>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();

是不是很有趣呢!

以上就是php中反射如何获取一个类中的方法详解的详细内容,其它编程语言

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表