全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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 : 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小时内与您取得联系。