>  기사  >  데이터 베이스  >  PHP에서 리플렉션을 사용하여 클래스의 메서드를 얻는 방법에 대한 자세한 설명

PHP에서 리플렉션을 사용하여 클래스의 메서드를 얻는 방법에 대한 자세한 설명

黄舟
黄舟원래의
2017-09-08 14:57:211551검색

이 글에서는 리플렉션을 기반으로 클래스의 모든 메소드를 얻기 위한 PHP를 주로 소개합니다. 또한 리플렉션 메커니즘을 사용하여 PHP가 클래스의 모든 속성과 메소드를 얻기 위한 단계와 관련 주의 사항을 예제 형식으로 자세히 분석합니다. 이 문서의 다음

예제는 PHP가 리플렉션을 기반으로 클래스의 모든 메서드를 얻는 방법을 설명합니다. 다음과 같이 참조할 수 있도록 모든 사람과 공유하십시오.

소스 코드도 문서도 없는 클래스(특히 mysqli, Redis 클래스와 같은 PHP 확장에서 제공되는 클래스)를 사용할 때 이 클래스에서 제공되는 내용을 어떻게 알 수 있습니까? ? 어떤 방법과 각 방법을 사용하는 방법이 PHP의 강력한 반영이 작용하는 부분입니다. 다음은 Redis 확장을 예로 사용하는 코드 데모입니다.


<?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;
}

반환 결과:


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

인쇄 결과:


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

는 필수 매개변수를 보지 못했습니다. 이는 메소드의 특정 구현과 관련이 있을 수 있습니다. 구체적인 이유는 redis 확장의 코드 구현에서만 볼 수 있습니다. . 일반적인 상황에서는 mysqli를 사용하여 다음 형식을 반환해야 합니다. select_db 메서드를 예로 들어 보겠습니다.


$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() 返回可打印的形式;


---------------------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(&#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();

을 게시하는 등 비슷한 방법을 참조하세요. 재미있지 않나요!

위 내용은 PHP에서 리플렉션을 사용하여 클래스의 메서드를 얻는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.