PHP如何知道一个类中所有的方法

当我们使用一个类时既没有源码也没有文档时(尤其是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();


是不是很有趣呢!

猜你喜欢

转载自www.cnblogs.com/hnhycnlc888/p/9630764.html