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.装饰着模式:特点是被增强对象可变,但 ...
随机推荐
- 使用PullToRefreshListView时遇到Item点击事件失效问题 解决方法
最近在自己的项目中使用到了以下开源项目: https://github.com/nanchen2251/pullToRefreshDemo 相关介绍博客如下: http://www.cnblogs.c ...
- linux下环境变量PATH设置错误的补救
本文转自: http://blog.clzg.cn/blog-614449-740527.html 之前不小心在/etc/profile中添加了错误的PATH变量,导致几乎所有的系统命令无法使用 ...
- 一个简单的程序,统计文本文档中的单词和汉字数,逆序排列(出现频率高的排在最前面)。python实现。
仅简单统计英文. from collections import Counter f = open('1') c = Counter() for line in f: g = (x for x in ...
- BZOJ2761: [JLOI2011]不重复数字【set】【傻逼题】
Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 ...
- 异步任务中的重新进入(Reentrancy)
一个按钮,点击执行一个任务.我们可能直接在它的 Click 事件中写下了执行任务的代码. 一般我们无需担心这样的代码会出现什么问题——但是,这样的好事情只对同步任务有效:一旦进入了异步世界,这便是无尽 ...
- 简单实现Jmail发送邮件
package com.chauvet.util; import java.util.Properties; import javax.mail.*; import javax.mail.intern ...
- WPF自适应可关闭的TabControl 类似浏览器的标签页(转)
效果如图: 虽然说是自适应可关闭的TabControl,但TabControl并不需要改动,不如叫自适应可关闭的TabItem. 大体思路:建一个用户控件,继承自TabItem,里面放个按钮,点击的时 ...
- psd文件导出为图片教程
美术给过来PSD文件好多层啊.怎么挨个把需要的图片导出来呢. 1. 选中 要导出的图片的图层 2.ctrl+N 新建个文档 然后把图片拉到 新的里面 然后点图像-裁剪 确定就行了,然后ctrl+s保 ...
- jeecg中一对多的关系映射
1.首先看一张前端页面: 有一张主表和3张子表,显示这3张子表的代码如下 <t:tabs id="tt" iframe="false" tabPositi ...
- C#如何:启用和禁用自动绑定重定向 (微软)
https://msdn.microsoft.com/zh-cn/library/2fc472t2.aspx 如何:启用和禁用自动绑定重定向 .NET Framework (current versi ...