当我们使用一个类时既没有源码也没有文档时(尤其是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. angular 动态修改 ng-bind-html

  2. LNMP架构基础搭建

    LNMP架构+wordpress博客 环境: centos6.7 2.6.32-573.el6.x86_64 nginx-1.6.3 mysql-5.5.49 php-5.3.27 wordpress ...

  3. TortoiseGit使用入门

    TortoiseGit使用入门 本地使用Git 首先要确定TortoiseGit已找到msysgit,如果先安装msysgit 再装TortoiseGit, 一般TortoiseGit 就会自动的识别 ...

  4. BZOJ3144 Hnoi2013 切糕 【网络流】*

    BZOJ3144 Hnoi2013 切糕 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的 ...

  5. SPOJ104 Highways 【矩阵树定理】

    SPOJ104 Highways Description In some countries building highways takes a lot of time- Maybe that's b ...

  6. 优化 UWP 中图片的内存占用

    跟图片打交道的 UWP 应用或多或少都会遇到图片带来的性能问题,就算不主要处理图片,做个论坛做个新闻客户端都涉及到大量图片.一个帖子.一篇文章里多半都是些高清大图,这些图片一张即可占用程序 1~2M ...

  7. 使 32 位程序使用大于 2GB 的内存

    不管在 32 位 Windows 上还是在 64 位 Windows 上,32 位的应用程序都只能使用最大 2GB 的内存,这是我们司空见惯的一个设定.但其实 Windows 提供了一些方法让我们打破 ...

  8. python笔记-12 redis缓存

    一.redis引入 1.简要概括redis 1.1 redis默认端口:6379 1.2 redis实现的效果:资源共享 1.3 redis实现的基本原理:不同的进程和一个公共的进程之间建立socke ...

  9. 《selenium2 python 自动化测试实战》(5)——键盘事件

    键盘事件,就是键盘上的一些操作,比如Ctrl +C,Ctrl+V,Ctrl+X等. 对键盘的操作需要导入另一个键盘的库: from selenium.webdriver.common.keys imp ...

  10. python 访问权限和下划线

    Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据 1.__xx__(两边两个下划线):是特列方法像__init__之类的,是python的内嵌的方法在特定的时候会被 ...