当我们使用一个类时既没有源码也没有文档时(尤其是php扩展提供的类,比如mysqli,Redis类),我们该怎么知道这个类中提供了哪些方法,以及每个方法该怎么使用呢,此时就该PHP中强大的反射登场了,下面以Redis扩展为例用代码演示:

当我们使用一个类时既没有源码也没有文档时(尤其是php扩展提供的类,比如mysqli,Redis类),我们该怎么知道这个类中提供了哪些方法,以及每个方法该怎么使用呢,此时就该PHP中强大的反射登场了,下面以Redis扩展为例用代码演示:

  1.  
    <?php
  2.  
     
  3.  
    $ref = new ReflectionClass('Redis');
  4.  
     
  5.  
    $consts = $ref->getConstants(); //返回所有常量名和值
  6.  
    echo "----------------consts:---------------" . PHP_EOL;
  7.  
    foreach ($consts as $key => $val)
  8.  
    {
  9.  
    echo "$key : $val" . PHP_EOL;
  10.  
    }
  11.  
     
  12.  
    $props = $ref->getDefaultProperties(); //返回类中所有属性
  13.  
    echo "--------------------props:--------------" . PHP_EOL . PHP_EOL;
  14.  
    foreach ($props as $key => $val)
  15.  
    {
  16.  
    echo "$key : $val" . PHP_EOL; // 属性名和属性值
  17.  
    }
  18.  
     
  19.  
    $methods = $ref->getMethods(); //返回类中所有方法
  20.  
    echo "-----------------methods:---------------" . PHP_EOL . PHP_EOL;
  21.  
    foreach ($methods as $method)
  22.  
    {
  23.  
    echo $method->getName() . PHP_EOL;
  24.  
    }

返回结果:

  1.  
    ----------------consts:---------------
  2.  
    REDIS_NOT_FOUND : 0
  3.  
    REDIS_STRING : 1
  4.  
    REDIS_SET : 2
  5.  
    REDIS_LIST : 3
  6.  
    REDIS_ZSET : 4
  7.  
    REDIS_HASH : 5
  8.  
    ATOMIC : 0
  9.  
    MULTI : 1
  10.  
    PIPELINE : 2
  11.  
    OPT_SERIALIZER : 1
  12.  
    OPT_PREFIX : 2
  13.  
    OPT_READ_TIMEOUT : 3
  14.  
    SERIALIZER_NONE : 0
  15.  
    SERIALIZER_PHP : 1
  16.  
    OPT_SCAN : 4
  17.  
    SCAN_RETRY : 1
  18.  
    SCAN_NORETRY : 0
  19.  
    AFTER : after
  20.  
    BEFORE : before
  21.  
    --------------------props:--------------
  22.  
     
  23.  
    -----------------methods:---------------
  24.  
     
  25.  
    __construct
  26.  
    __destruct
  27.  
    connect
  28.  
    pconnect
  29.  
    close
  30.  
    ping
  31.  
    echo
  32.  
    get
  33.  
    set
  34.  
    setex
  35.  
    psetex
  36.  
    setnx
  37.  
    getSet
  38.  
    randomKey
  39.  
    renameKey
  40.  
    renameNx
  41.  
    getMultiple
  42.  
    exists
  43.  
    delete
  44.  
    incr
  45.  
    incrBy
  46.  
    incrByFloat
  47.  
    decr
  48.  
    decrBy
  49.  
    type
  50.  
    append
  51.  
    getRange
  52.  
    setRange
  53.  
    getBit
  54.  
    setBit
  55.  
    strlen
  56.  
    getKeys
  57.  
    sort
  58.  
    sortAsc
  59.  
    sortAscAlpha
  60.  
    sortDesc
  61.  
    sortDescAlpha
  62.  
    lPush
  63.  
    rPush
  64.  
    lPushx
  65.  
    rPushx
  66.  
    lPop
  67.  
    rPop
  68.  
    blPop
  69.  
    brPop
  70.  
    lSize
  71.  
    lRemove
  72.  
    listTrim
  73.  
    lGet
  74.  
    lGetRange
  75.  
    lSet
  76.  
    lInsert
  77.  
    sAdd
  78.  
    sSize
  79.  
    sRemove
  80.  
    sMove
  81.  
    sPop
  82.  
    sRandMember
  83.  
    sContains
  84.  
    sMembers
  85.  
    sInter
  86.  
    sInterStore
  87.  
    sUnion
  88.  
    sUnionStore
  89.  
    sDiff
  90.  
    sDiffStore
  91.  
    setTimeout
  92.  
    save
  93.  
    bgSave
  94.  
    lastSave
  95.  
    flushDB
  96.  
    flushAll
  97.  
    dbSize
  98.  
    auth
  99.  
    ttl
  100.  
    pttl
  101.  
    persist
  102.  
    info
  103.  
    resetStat
  104.  
    select
  105.  
    move
  106.  
    bgrewriteaof
  107.  
    slaveof
  108.  
    object
  109.  
    bitop
  110.  
    bitcount
  111.  
    bitpos
  112.  
    mset
  113.  
    msetnx
  114.  
    rpoplpush
  115.  
    brpoplpush
  116.  
    zAdd
  117.  
    zDelete
  118.  
    zRange
  119.  
    zReverseRange
  120.  
    zRangeByScore
  121.  
    zRevRangeByScore
  122.  
    zRangeByLex
  123.  
    zCount
  124.  
    zDeleteRangeByScore
  125.  
    zDeleteRangeByRank
  126.  
    zCard
  127.  
    zScore
  128.  
    zRank
  129.  
    zRevRank
  130.  
    zInter
  131.  
    zUnion
  132.  
    zIncrBy
  133.  
    expireAt
  134.  
    pexpire
  135.  
    pexpireAt
  136.  
    hGet
  137.  
    hSet
  138.  
    hSetNx
  139.  
    hDel
  140.  
    hLen
  141.  
    hKeys
  142.  
    hVals
  143.  
    hGetAll
  144.  
    hExists
  145.  
    hIncrBy
  146.  
    hIncrByFloat
  147.  
    hMset
  148.  
    hMget
  149.  
    multi
  150.  
    discard
  151.  
    exec
  152.  
    pipeline
  153.  
    watch
  154.  
    unwatch
  155.  
    publish
  156.  
    subscribe
  157.  
    psubscribe
  158.  
    unsubscribe
  159.  
    punsubscribe
  160.  
    time
  161.  
    eval
  162.  
    evalsha
  163.  
    script
  164.  
    debug
  165.  
    dump
  166.  
    restore
  167.  
    migrate
  168.  
    getLastError
  169.  
    clearLastError
  170.  
    _prefix
  171.  
    _serialize
  172.  
    _unserialize
  173.  
    client
  174.  
    scan
  175.  
    hscan
  176.  
    zscan
  177.  
    sscan
  178.  
    pfadd
  179.  
    pfcount
  180.  
    pfmerge
  181.  
    getOption
  182.  
    setOption
  183.  
    config
  184.  
    slowlog
  185.  
    rawCommand
  186.  
    getHost
  187.  
    getPort
  188.  
    getDBNum
  189.  
    getTimeout
  190.  
    getReadTimeout
  191.  
    getPersistentID
  192.  
    getAuth
  193.  
    isConnected
  194.  
    getMode
  195.  
    wait
  196.  
    pubsub
  197.  
    open
  198.  
    popen
  199.  
    lLen
  200.  
    sGetMembers
  201.  
    mget
  202.  
    expire
  203.  
    zunionstore
  204.  
    zinterstore
  205.  
    zRemove
  206.  
    zRem
  207.  
    zRemoveRangeByScore
  208.  
    zRemRangeByScore
  209.  
    zRemRangeByRank
  210.  
    zSize
  211.  
    substr
  212.  
    rename
  213.  
    del
  214.  
    keys
  215.  
    lrem
  216.  
    ltrim
  217.  
    lindex
  218.  
    lrange
  219.  
    scard
  220.  
    srem
  221.  
    sismember
  222.  
    zrevrange
  223.  
    sendEcho
  224.  
    evaluate
  225.  
    evaluateSha

进一步当我们想要知道具体一个方法怎么使用,有哪些参数时,我们可以对这个方法进行进一步的反射,以上例中的bitpos方法为例(文档中并没有介绍该方法的使用)

  1.  
    echo '---------------------params-----------------------' . PHP_EOL . PHP_EOL;
  2.  
    $reflectMethod = $ref->getMethod('bitpos'); //传入方法名即可
  3.  
    echo $reflectMethod; // 会调用$reflectMethod->__toString() 返回可打印的形式;

打印结果:

  1.  
    ---------------------params-----------------------
  2.  
     
  3.  
    Method [ <internal:redis> public method bitpos ] {
  4.  
    }

并没有看到需要参数,可能与该方法的具体实现有关,具体原因只能去看redis扩展的代码实现,正常情况下应该是返回如下的形式,以mysqli的select_db方法为例:

  1.  
    $ref = new ReflectionClass('mysqli');
  2.  
    echo '---------------------params-----------------------' . PHP_EOL . PHP_EOL;
  3.  
    $reflectMethod = $ref->getMethod('select_db'); //传入方法名即可
  4.  
    echo $reflectMethod; // 会调用$reflectMethod->__toString() 返回可打印的形式;
  1.  
    ---------------------params-----------------------
  2.  
     
  3.  
    Method [ <internal:mysqli> public method select_db ] {
  4.  
     
  5.  
    - Parameters [1] {
  6.  
    Parameter #0 [ <required> $database ]
  7.  
    }
  8.  
    }

这时就没办法了 我们只能靠对redis的理解以及参考相似方法来使用了,比如bitop

public function bitOp( $operation, $retKey, ...$keys) {}

贴下最终的方法调用

  1.  
    $redis = new Redis();
  2.  
    $redis->connect('127.0.0.1');
  3.  
     
  4.  
    $redis->setBit('bit', 15, 1);
  5.  
    echo 'bitpos: ' . $redis->bitpos('bit', 1) . PHP_EOL; //bitpos: 15
  6.  
    $redis->close();

是不是很有趣呢!

PHP如何知道一个类中所有的方法的更多相关文章

  1. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  2. delphi 中如何访问另一个类中到私有方法?(转载)

    原始连接 http://rvelthuis.blogspot.tw/2018/01/accessing-private-methods-of-another.html Accessing privat ...

  3. Java中的一个类怎么调用另一个类中的方法

    如果另一个类中的那个方法是私有的话,就不能直接调用到,如果是其他类型的话看情况,如果是静态的(static)话,直接用类名可以调用到,如果是非静态的,就需要利用另一个类的实例(也就是用那个类生成的对象 ...

  4. PHP通过反射方法调用执行类中的私有方法

    PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php //MyClass这个类中包 ...

  5. Android反射出一个类中的其他类对象并调用其对应方法

    MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...

  6. 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 ...

  7. Java反射机制demo(五)—获得并调用一个类中的方法

    Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...

  8. @selector 如何调用在另一个类中的静态函数?

    可以在同一个类的methodName这个函数中再调用另一个类中的静态方法

  9. Java中增强一个类的几种方法

    今天有人问我怎么增强一个类的功能.博客刚好没东西,今天就讲讲增强类. 增强的手段有三种类型: 1.继承或者实现接口:特点是被增强对象不能变,增强的内容不能变. 2.装饰着模式:特点是被增强对象可变,但 ...

随机推荐

  1. GitHub原来也可以用SVN客户端的.

    不知道是不是自己真的太宅了. 一直以为只能用git client 来clone github工程的.  偶然今日发现还可以用 SVN 来下载的. 果断一试. 太好用了. 这回windows 上不用纠结 ...

  2. 【转】Ubuntu16.04安装WPS

    下载安装下载WPS For Linux:http://community.wps.cn/download/ 直接下载:http://kdl.cc.ksosoft.com/wps-community/d ...

  3. python使用wget下载网络文件

    wget是一个从网络上自动下载文件的自由工具.它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. ubuntu 安装wget pip install wget 从网络或本地硬盘下载文件(并 ...

  4. 使用PullToRefreshListView时遇到Item点击事件失效问题 解决方法

    最近在自己的项目中使用到了以下开源项目: https://github.com/nanchen2251/pullToRefreshDemo 相关介绍博客如下: http://www.cnblogs.c ...

  5. Vue之通过代理设置跨域访问

    我们使用脚手架创建的项目,可以在config项目中看到

  6. 特性属性 @property

    实现其它语言所拥有的 getter 和 setter 的功能 作用: 用来模拟一个属性 通过@property 装饰器可以对模拟属性的取值和赋值加以控制 class Student: def __in ...

  7. ptr_fun

    ptr_fun 分类: C/C++2012-05-05 20:21 593人阅读 评论(0) 收藏 举报 functionclassfunobjectreturningtypes   目录(?)[-] ...

  8. AX内部公司

    <object width="450" height="500" align="middle" id="reader&quo ...

  9. matlab图像处理注意溢出!先要im2double!

    imagedata_comb=imagedata_ebic*addnumber_ebic+imagedata_sem*addnumber_sem; %注意溢出啊!!!uint8最大值是255,也就是说 ...

  10. 51nod 1118 机器人走方格

    M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. 收起   输入 第1行,2个数M,N,中间用空格隔开 ...