Heim  >  Artikel  >  Backend-Entwicklung  >  PHP verwendet Reflektion, um alle Methoden in einer Klasse abzurufen.

PHP verwendet Reflektion, um alle Methoden in einer Klasse abzurufen.

巴扎黑
巴扎黑Original
2017-09-09 14:35:332216Durchsuche

In diesem Artikel wird hauptsächlich PHP vorgestellt, um alle Methoden in einer Klasse basierend auf der Reflexion zu erhalten. In Kombination mit dem Beispielformular werden die Schritte und zugehörigen Vorsichtsmaßnahmen für die Verwendung des Reflexionsmechanismus zum Abrufen aller Attribute und Methoden in der Klasse detailliert analysiert . Freunde, die es brauchen Sie können sich auf Folgendes beziehen

Das Beispiel in diesem Artikel beschreibt, wie PHP alle Methoden in einer Klasse basierend auf Reflexion erhält. Teilen Sie es allen als Referenz mit, wie folgt:

Wenn wir eine Klasse ohne Quellcode oder Dokumentation verwenden (insbesondere Klassen, die von PHP-Erweiterungen bereitgestellt werden, z. B. MySQL- oder Redis-Klassen), woher sollen wir dieses Was wissen? Methoden werden in der Klasse bereitgestellt und wie wird jede Methode verwendet? Zu diesem Zeitpunkt kommt die leistungsstarke Reflexion in PHP auf die Bühne. Das Folgende ist eine Codedemonstration am Beispiel der Redis-Erweiterung:


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

Rückgabeergebnis:


----------------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

Wenn wir außerdem wissen möchten, wie eine bestimmte Methode verwendet wird und welche Parameter sie hat, müssen wir kann diese Methode ausführen Nehmen Sie zur weiteren Reflexion die Bitpos-Methode im obigen Beispiel als Beispiel (die Verwendung dieser Methode wird im Dokument nicht vorgestellt)


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

Druckergebnis:


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

hat die erforderlichen Parameter nicht gesehen, was möglicherweise mit der spezifischen Implementierung der Methode zusammenhängt. Der spezifische Grund ist nur im Code zu sehen Implementierung der Redis-Erweiterung. Unter normalen Umständen sollte die folgende Form zurückgegeben werden: Nehmen Sie die Methode select_db von MySQL:


$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 ]
 }
}

Zu diesem Zeitpunkt haben wir keine andere Wahl, als uns auf Redis zu verlassen. Verstehen Sie und verweisen Sie auf ähnliche Methoden wie Bitop


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

Veröffentlichen Sie den letzten Methodenaufruf


$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();

Ist das nicht interessant?

Das obige ist der detaillierte Inhalt vonPHP verwendet Reflektion, um alle Methoden in einer Klasse abzurufen.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn