Heim > Artikel > Backend-Entwicklung > PHP verwendet Reflektion, um alle Methoden in einer Klasse abzurufen.
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('Redis'); $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 '---------------------params-----------------------' . PHP_EOL . PHP_EOL; $reflectMethod = $ref->getMethod('bitpos'); //传入方法名即可 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('mysqli'); echo '---------------------params-----------------------' . PHP_EOL . PHP_EOL; $reflectMethod = $ref->getMethod('select_db'); //传入方法名即可 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('127.0.0.1'); $redis->setBit('bit', 15, 1); echo 'bitpos: ' . $redis->bitpos('bit', 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!