Home > Database > Mysql Tutorial > body text

Detailed explanation of how to obtain methods in a class using reflection in php

黄舟
Release: 2017-09-08 14:57:21
Original
1555 people have browsed it

This article mainly introduces PHP to obtain all the methods in a class based on reflection. Combined with the example form, it analyzes in detail the steps and related precautions for using the reflection mechanism to obtain all properties and methods in the class. Friends who need it You can refer to the following example

This article describes how PHP obtains all methods in a class based on reflection. Share it with everyone for your reference, as follows:

When we use a class with neither source code nor documentation (especially classes provided by php extensions, such as mysqli, Redis classes), how should we know this What methods are provided in the class, and how to use each method? At this time, the powerful reflection in PHP comes on stage. The following is a code demonstration using the Redis extension as an example:


<?php
$ref = new ReflectionClass(&#39;Redis&#39;);
$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;
}
Copy after login

Return result:


----------------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
Copy after login

Further, when we want to know how to use a specific method and what parameters it has, we can further reflect on this method, Take the bitpos method in the above example as an example (the use of this method is not introduced in the document)


echo &#39;---------------------params-----------------------&#39; . PHP_EOL . PHP_EOL;
$reflectMethod = $ref->getMethod(&#39;bitpos&#39;);  //传入方法名即可
echo $reflectMethod;  // 会调用$reflectMethod->__toString() 返回可打印的形式;
Copy after login

Print results:


---------------------params-----------------------
Method [ <internal:redis> public method bitpos ] {
}
Copy after login

did not see the required parameters, which may be related to the specific implementation of the method. The specific reason can only be seen in the code implementation of the redis extension. Under normal circumstances, the following form should be returned. Take the select_db method of mysqli as an example:


$ref = new ReflectionClass(&#39;mysqli&#39;);
echo &#39;---------------------params-----------------------&#39; . PHP_EOL . PHP_EOL;
$reflectMethod = $ref->getMethod(&#39;select_db&#39;);  //传入方法名即可
echo $reflectMethod;  // 会调用$reflectMethod->__toString() 返回可打印的形式;
Copy after login


---------------------params-----------------------
Method [ <internal:mysqli> public method select_db ] {
 - Parameters [1] {
  Parameter #0 [ <required> $database ]
 }
}
Copy after login

At this time, we have no choice but to rely on our understanding of redis and refer to similar methods to use it, such as bitop


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

Isn’t it interesting to post the final method call


$redis = new Redis();
$redis->connect(&#39;127.0.0.1&#39;);
$redis->setBit(&#39;bit&#39;, 15, 1);
echo &#39;bitpos: &#39; . $redis->bitpos(&#39;bit&#39;, 1) . PHP_EOL; //bitpos: 15
$redis->close();
Copy after login

!

The above is the detailed content of Detailed explanation of how to obtain methods in a class using reflection in php. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
php
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template