>  기사  >  백엔드 개발  >  PHP는 리플렉션을 기반으로 클래스의 모든 속성을 얻습니다.

PHP는 리플렉션을 기반으로 클래스의 모든 속성을 얻습니다.

墨辰丷
墨辰丷원래의
2018-05-18 10:22:013166검색

이 글에서는 리플렉션을 기반으로 클래스의 모든 메소드를 얻기 위한 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 ] {
}

매개변수가 필요하지 않으며 이는 메소드의 특정 구현과 관련될 수 있습니다. 일반적인 상황에서는 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

Reflection 클래스 PHP

🎜🎜🎜🎜🎜에 대한 자세한 설명

위 내용은 PHP는 리플렉션을 기반으로 클래스의 모든 속성을 얻습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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