本文实例讲述了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 : 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();
是不是很有趣呢!
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
# PHP
# 反射
# 获取
# 类
# 方法
# PHP的反射动态获取类方法、属性、参数操作示例
# php面试实现反射注入的详细方法
# PHP反射原理与用法深入分析
# php提供实现反射的方法和实例代码
# PHP进阶学习之反射基本概念与用法分析
# php反射学习之不用new方法实例化类操作示例
# PHP反射学习入门示例
# PHP反射实际应用示例
# 用PHP的反射实现委托模式的讲解
# 浅析PHP类的反射来实现依赖注入过程
# PHP基于反射机制实现自动依赖注入的方法详解
# PHP反射基础知识回顾
# 类中
# 为例
# 当我们
# 该怎么
# 程序设计
# 操作技巧
# 文档
# 相关内容
# 尤其是
# 不是很
# 感兴趣
# 我们可以
# 就没
# 去看
# 给大家
# 更多关于
# 就该
# 方法来
# 所述
# 面向对象
相关文章:
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
安云自助建站系统如何快速提升SEO排名?
如何通过远程VPS快速搭建个人网站?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
javascript基本数据类型及类型检测常用方法小结
建站DNS解析失败?如何正确配置域名服务器?
西安专业网站制作公司有哪些,陕西省建行官方网站?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
如何通过免费商城建站系统源码自定义网站主题与功能?
建站为何优先选择香港服务器?
如何快速搭建高效香港服务器网站?
如何高效利用亚马逊云主机搭建企业网站?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
如何快速搭建响应式可视化网站?
,在苏州找工作,上哪个网站比较好?
如何选择CMS系统实现快速建站与SEO优化?
如何在阿里云通过域名搭建网站?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Swift中循环语句中的转移语句 break 和 continue
视频网站app制作软件,有什么好的视频聊天网站或者软件?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何通过建站之星自助学习解决操作问题?
建站主机如何选?性能与价格怎样平衡?
淘宝制作网站有哪些,淘宝网官网主页?
制作电商网页,电商供应链怎么做?
如何获取免费开源的自助建站系统源码?
建站主机是否属于云主机类型?
图册素材网站设计制作软件,图册的导出方式有几种?
如何选购建站域名与空间?自助平台全解析
建站之星会员如何解锁更多建站功能?
红河网站制作公司,红河事业单位身份证如何上传?
建站之星如何实现PC+手机+微信网站五合一建站?
北京企业网站设计制作公司,北京铁路集团官方网站?
如何在Windows 2008云服务器安全搭建网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Android自定义listview布局实现上拉加载下拉刷新功能
制作网站公司那家好,网络公司是做什么的?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
郑州企业网站制作公司,郑州招聘网站有哪些?
建站之星如何助力企业快速打造五合一网站?
相册网站制作软件,图片上的网址怎么复制?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何零成本快速生成个人自助网站?
北京网站制作网页,网站升级改版需要多久?
如何通过可视化优化提升建站效果?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
h5网站制作工具有哪些,h5页面制作工具有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。