이 글에서는 리플렉션을 기반으로 클래스의 모든 메소드를 얻기 위한 PHP를 주로 소개합니다. 또한 리플렉션 메커니즘을 사용하여 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 ] { }
는 필수 매개변수를 보지 못했습니다. 이는 메소드의 특정 구현과 관련이 있을 수 있습니다. 구체적인 이유는 redis 확장의 코드 구현에서만 볼 수 있습니다. . 일반적인 상황에서는 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();
을 게시하는 등 비슷한 방법을 참조하세요. 재미있지 않나요!
위 내용은 PHP에서 리플렉션을 사용하여 클래스의 메서드를 얻는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!