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.装饰着模式:特点是被增强对象可变,但 ...
随机推荐
- GitHub原来也可以用SVN客户端的.
不知道是不是自己真的太宅了. 一直以为只能用git client 来clone github工程的. 偶然今日发现还可以用 SVN 来下载的. 果断一试. 太好用了. 这回windows 上不用纠结 ...
- 【转】Ubuntu16.04安装WPS
下载安装下载WPS For Linux:http://community.wps.cn/download/ 直接下载:http://kdl.cc.ksosoft.com/wps-community/d ...
- python使用wget下载网络文件
wget是一个从网络上自动下载文件的自由工具.它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. ubuntu 安装wget pip install wget 从网络或本地硬盘下载文件(并 ...
- 使用PullToRefreshListView时遇到Item点击事件失效问题 解决方法
最近在自己的项目中使用到了以下开源项目: https://github.com/nanchen2251/pullToRefreshDemo 相关介绍博客如下: http://www.cnblogs.c ...
- Vue之通过代理设置跨域访问
我们使用脚手架创建的项目,可以在config项目中看到
- 特性属性 @property
实现其它语言所拥有的 getter 和 setter 的功能 作用: 用来模拟一个属性 通过@property 装饰器可以对模拟属性的取值和赋值加以控制 class Student: def __in ...
- ptr_fun
ptr_fun 分类: C/C++2012-05-05 20:21 593人阅读 评论(0) 收藏 举报 functionclassfunobjectreturningtypes 目录(?)[-] ...
- AX内部公司
<object width="450" height="500" align="middle" id="reader&quo ...
- matlab图像处理注意溢出!先要im2double!
imagedata_comb=imagedata_ebic*addnumber_ebic+imagedata_sem*addnumber_sem; %注意溢出啊!!!uint8最大值是255,也就是说 ...
- 51nod 1118 机器人走方格
M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. 收起 输入 第1行,2个数M,N,中间用空格隔开 ...