PHP如何知道一个类中所有的方法
当我们使用一个类时既没有源码也没有文档时(尤其是php扩展提供的类,比如mysqli,Redis类),我们该怎么知道这个类中提供了哪些方法,以及每个方法该怎么使用呢,此时就该PHP中强大的反射登场了,下面以Redis扩展为例用代码演示:
当我们使用一个类时既没有源码也没有文档时(尤其是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如何知道一个类中所有的方法的更多相关文章
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- delphi 中如何访问另一个类中到私有方法?(转载)
原始连接 http://rvelthuis.blogspot.tw/2018/01/accessing-private-methods-of-another.html Accessing privat ...
- Java中的一个类怎么调用另一个类中的方法
如果另一个类中的那个方法是私有的话,就不能直接调用到,如果是其他类型的话看情况,如果是静态的(static)话,直接用类名可以调用到,如果是非静态的,就需要利用另一个类的实例(也就是用那个类生成的对象 ...
- PHP通过反射方法调用执行类中的私有方法
PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php //MyClass这个类中包 ...
- Android反射出一个类中的其他类对象并调用其对应方法
MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...
- C#判断一个类中有无"指定名称"的方法
C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...
- Java反射机制demo(五)—获得并调用一个类中的方法
Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...
- @selector 如何调用在另一个类中的静态函数?
可以在同一个类的methodName这个函数中再调用另一个类中的静态方法
- Java中增强一个类的几种方法
今天有人问我怎么增强一个类的功能.博客刚好没东西,今天就讲讲增强类. 增强的手段有三种类型: 1.继承或者实现接口:特点是被增强对象不能变,增强的内容不能变. 2.装饰着模式:特点是被增强对象可变,但 ...
随机推荐
- SpreadJS 在 Angular2 中支持绑定哪些属性?
SpreadJS 纯前端表格控件是基于 HTML5 的 JavaScript 电子表格和网格功能控件,提供了完备的公式引擎.排序.过滤.输入控件.数据可视化.Excel 导入/导出等功能,适用于 .N ...
- 程序设计入门-C语言基础知识-翁恺-期中测试
一.试题 程序设计入门—C 语言期中测评 试题下载地址: http://nos.netease.com/edu-lesson-pdfsrc/217E194E46A6595A3F554380337490 ...
- 利用索引与不用索引区别(profiles)
1.定义 对数据库表的一列或多列的值进行排序的一种结构(Btree方式)=(相当于二分查找法) 2.优点 加快数据检索速度 3.缺点 1.占用物理存储空间 2.当对表中数据更新时,索引需要动态维护,降 ...
- 类中的__slots__方法与__dict__方法相排斥
类的 __slots__ 列表 作用: 限定一个类创建的实例只能有固定的属性(实例变量) 不允许对象添加列表以外的属性(实例变量) 防止用户因错写属性的名称而发生程序错误 说明: 1. __slots ...
- Java启动参数及调优
java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容:其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且 ...
- Form表单如何传递List数组对象到后台的解决办法(转)
举例说明: [后台有一个对象 User 一个PhotoDo对象],结构如下: public class User{ private String username; private List&l ...
- CentOS 6.6下安装OpenOffice4.0
最近由于项目需要,要在公司服务器上安装Openoffice,网上搜了一些资料后成功安装,现分享给大家. 1.首先先下载好需要的rpm包:Apache_OpenOffice_4.0.0_Linux_x8 ...
- BZOJ4974:[lydsy1708月赛]字符串大师
浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html 题目传送门:https://lydsy.com/JudgeOnline/problem. ...
- 利用Instrument Leak来发现App中的内存泄露
XCode提供了一组用于检测内存,调试动画,布局等的工具.对于调试一些性能问题,内存问题非常方便.这里我们使用Leak来发现代码中的内存泄露. 在Leak中启动我们的应用开始监控: 注意,在监控的时候 ...
- linux文本处理命令 一
1,cut 主要的用途在于将同一行里面的数据进行分解 cut -d ‘分隔符’ -f ‘第几段’ 和-f同时使用 -c 字符区间 截取字符区间 2,grep cut 是在一行讯息当 ...