PHP基于反射获取一个类中所有的方法

发布时间 - 2026-01-11 03:10:10    点击率:

本文实例讲述了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反射基础知识回顾  # 类中  # 为例  # 当我们  # 该怎么  # 程序设计  # 操作技巧  # 文档  # 相关内容  # 尤其是  # 不是很  # 感兴趣  # 我们可以  # 就没  # 去看  # 给大家  # 更多关于  # 就该  # 方法来  # 所述  # 面向对象 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Blade模板引擎?(完整语法和示例)  php json中文编码为null的解决办法  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  音乐网站服务器如何优化API响应速度?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  实例解析Array和String方法  Laravel怎么为数据库表字段添加索引以优化查询  Thinkphp 中 distinct 的用法解析  Laravel如何使用Service Container和依赖注入?(代码示例)  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  如何用已有域名快速搭建网站?  bootstrap日历插件datetimepicker使用方法  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  如何用低价快速搭建高质量网站?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Android仿QQ列表左滑删除操作  Laravel如何使用Blade组件和插槽?(Component代码示例)  如何用美橙互联一键搭建多站合一网站?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  javascript基于原型链的继承及call和apply函数用法分析  Laravel怎么实现验证码(Captcha)功能  如何快速使用云服务器搭建个人网站?  个人网站制作流程图片大全,个人网站如何注销?  免费视频制作网站,更新又快又好的免费电影网站?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  如何在Tomcat中配置并部署网站项目?  Windows Hello人脸识别突然无法使用  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  长沙企业网站制作哪家好,长沙水业集团官方网站?  android nfc常用标签读取总结  如何在自有机房高效搭建专业网站?  nginx修改上传文件大小限制的方法  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  canvas 画布在主流浏览器中的尺寸限制详细介绍  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  如何在IIS中新建站点并解决端口绑定冲突?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  lovemo网页版地址 lovemo官网手机登录  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel如何使用Passport实现OAuth2?(完整配置步骤)