이 글에서는 리플렉션을 기반으로 클래스의 모든 메소드를 얻기 위한 PHP를 주로 소개합니다. 또한 리플렉션 메커니즘을 사용하여 PHP가 클래스의 모든 속성과 메소드를 얻기 위한 단계와 관련 주의 사항을 예제 형식으로 자세히 분석합니다.
자세한 내용은 다음과 같습니다.
소스 코드도 문서도 없는 클래스(특히 mysqli, Redis 클래스 등 PHP 확장에서 제공하는 클래스)를 사용할 때 어떤 메서드가 제공되는지 어떻게 알 수 있나요? 이 수업에서는 PHP의 강력한 반영이 작동합니다. Redis 확장을 예로 들어 코드를 보여드리겠습니다.
<?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; }
반환 결과:
----------------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 '---------------------params-----------------------' . PHP_EOL . PHP_EOL; $reflectMethod = $ref->getMethod('bitpos'); //传入方法名即可 echo $reflectMethod; // 会调用$reflectMethod->__toString() 返回可打印的形式;
인쇄 결과:
---------------------params----------------------- Method [ <internal:redis> public method bitpos ] { }
매개변수가 필요하지 않으며 이는 메소드의 특정 구현과 관련될 수 있습니다. 일반적인 상황에서는 mysqli를 사용하여 다음 형식을 반환해야 합니다. select_db 메서드는 다음과 같습니다.
$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 ] } }
현재로서는 다른 방법이 없습니다. redis에 대한 이해에 의존하고 이를 사용하는 유사한 방법을 참조할 수 있습니다(예: bitop
public function bitOp( $operation, $retKey, ...$keys) {}
다음으로 최종 메서드 호출
$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();
관련 권장 사항:
Reflection 클래스 PHP
🎜🎜🎜🎜🎜에 대한 자세한 설명
위 내용은 PHP는 리플렉션을 기반으로 클래스의 모든 속성을 얻습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!