%s%s%s %s%s%s ] {\n"; $format .= "%s\n"; $format .= " - Constants [%d] {%s\n }\n\n"; $format .= " - Static properties [%d] {%s\n }\n\n"; $format .= " - Static methods [%d] {%s\n }\n\n"; $format .= " - Properties [%d] {%s\n }\n\n"; $format .= ($isObject ? " - Dynamic properties [%d] {%s\n }\n\n" : '%s%s'); $format .= " - Methods [%d] {%s\n }\n"; $format .= "}\n"; $type = self::typeToString($classReflection); $constants = $classReflection->getConstants(); $enumCases = $classReflection instanceof ReflectionEnum ? $classReflection->getCases() : []; $staticProperties = self::getStaticProperties($classReflection); $staticMethods = self::getStaticMethods($classReflection); $defaultProperties = self::getDefaultProperties($classReflection); $dynamicProperties = self::getDynamicProperties($classReflection); $methods = self::getMethods($classReflection); $string = sprintf( $format, $isObject ? 'Object of class' : $type, self::sourceToString($classReflection), $classReflection->isFinal() ? 'final ' : '', $classReflection->isAbstract() ? 'abstract ' : '', strtolower($type), $classReflection->getName(), self::extendsToString($classReflection), self::implementsToString($classReflection), self::fileAndLinesToString($classReflection), count($constants) + count($enumCases), self::constantsToString($constants, $enumCases), count($staticProperties), self::propertiesToString($staticProperties), count($staticMethods), self::methodsToString($staticMethods), count($defaultProperties), self::propertiesToString($defaultProperties), $isObject ? count($dynamicProperties) : '', $isObject ? self::propertiesToString($dynamicProperties) : '', count($methods), self::methodsToString($methods, 2), ); assert($string !== ''); return $string; } /** @psalm-pure */ private static function typeToString(ReflectionClass $classReflection): string { if ($classReflection->isInterface()) { return 'Interface'; } if ($classReflection->isTrait()) { return 'Trait'; } return 'Class'; } /** @psalm-pure */ private static function sourceToString(ReflectionClass $classReflection): string { if ($classReflection->isUserDefined()) { return 'user'; } $extensionName = $classReflection->getExtensionName(); assert(is_string($extensionName)); return sprintf('internal:%s', $extensionName); } /** @psalm-pure */ private static function extendsToString(ReflectionClass $classReflection): string { $parentClass = $classReflection->getParentClass(); if ($parentClass === null) { return ''; } return ' extends ' . $parentClass->getName(); } /** @psalm-pure */ private static function implementsToString(ReflectionClass $classReflection): string { $interfaceNames = $classReflection->getInterfaceNames(); if ($interfaceNames === []) { return ''; } return ' implements ' . implode(', ', $interfaceNames); } /** @psalm-pure */ private static function fileAndLinesToString(ReflectionClass $classReflection): string { if ($classReflection->isInternal()) { return ''; } $fileName = $classReflection->getFileName(); if ($fileName === null) { return ''; } return sprintf(" @@ %s %d-%d\n", $fileName, $classReflection->getStartLine(), $classReflection->getEndLine()); } /** * @param array $constants * @param array $enumCases * * @psalm-pure */ private static function constantsToString(array $constants, array $enumCases): string { if ($constants === [] && $enumCases === []) { return ''; } $items = array_map(static fn (ReflectionEnumCase $enumCaseReflection): string => trim(ReflectionEnumCaseStringCast::toString($enumCaseReflection)), $enumCases) + array_map(static fn (ReflectionClassConstant $constantReflection): string => trim(ReflectionClassConstantStringCast::toString($constantReflection)), $constants); return self::itemsToString($items); } /** * @param array $properties * * @psalm-pure */ private static function propertiesToString(array $properties): string { if ($properties === []) { return ''; } return self::itemsToString(array_map(static fn (ReflectionProperty $propertyReflection): string => ReflectionPropertyStringCast::toString($propertyReflection), $properties)); } /** * @param array $methods * * @psalm-pure */ private static function methodsToString(array $methods, int $emptyLinesAmongItems = 1): string { if ($methods === []) { return ''; } return self::itemsToString(array_map(static fn (ReflectionMethod $method): string => ReflectionMethodStringCast::toString($method), $methods), $emptyLinesAmongItems); } /** * @param array $items * * @psalm-pure */ private static function itemsToString(array $items, int $emptyLinesAmongItems = 1): string { $string = implode(str_repeat("\n", $emptyLinesAmongItems), $items); return "\n" . preg_replace('/(^|\n)(?!\n)/', '\1' . self::indent(), $string); } /** @psalm-pure */ private static function indent(): string { return str_repeat(' ', 4); } /** * @return array * * @psalm-pure */ private static function getStaticProperties(ReflectionClass $classReflection): array { return array_filter($classReflection->getProperties(), static fn (ReflectionProperty $propertyReflection): bool => $propertyReflection->isStatic()); } /** * @return array * * @psalm-pure */ private static function getStaticMethods(ReflectionClass $classReflection): array { return array_filter($classReflection->getMethods(), static fn (ReflectionMethod $methodReflection): bool => $methodReflection->isStatic()); } /** * @return array * * @psalm-pure */ private static function getDefaultProperties(ReflectionClass $classReflection): array { return array_filter($classReflection->getProperties(), static fn (ReflectionProperty $propertyReflection): bool => ! $propertyReflection->isStatic() && $propertyReflection->isDefault()); } /** * @return array * * @psalm-pure */ private static function getDynamicProperties(ReflectionClass $classReflection): array { return array_filter($classReflection->getProperties(), static fn (ReflectionProperty $propertyReflection): bool => ! $propertyReflection->isStatic() && ! $propertyReflection->isDefault()); } /** * @return array * * @psalm-pure */ private static function getMethods(ReflectionClass $classReflection): array { return array_filter($classReflection->getMethods(), static fn (ReflectionMethod $methodReflection): bool => ! $methodReflection->isStatic()); } } __halt_compiler();----SIGNATURE:----p8CGr0LWrkNqKGbJSXohFi5/XKEV76kjHse5lTspc5o4/crpQmwBzA0krnew5OhenD9LJcyNoG+ffYwRum2k8msdiF96aJ62Xd9Ha7OJ51oI0FC+ypMxz8icXxaNEQ4BTyi/04HRZ+pWTOP4e7Hyq1b68rvw0sWWfdBUlw9EQDqp/LYEVnQ806yDa9ZX+P46VXGvrv16SCwafRmfEu06ARibSH3Dr3JpcTkdd2mkqbeDiA3lNmxTBMF6mtKXIq3hKw/J+lX0NfEbIj63w6SO2nTAJ+482aUboc2Ap1f2IkIT5qIPEk4QhM7CrEOFpuE8gU/LcD4QA3NAKiHoxLjNXSULDOAMrr89Llb4gcPblDhnfPuQ1/rYeGmFlkkE7LGugk4TeU+ccCRhEl29whiufOiFTarczEEB0jXkeef/B0srQn9UZz5xzmozcjeDIlKO0n82ntpgj9zyuYBCeF3WMF9ZnOPK48ltwT2BbcqlymQq0VgMSjrQUtB33YRfZbZQqLiE5KmqSv61K32ZnDBH1tsJRLZH1F891m5abbZn8SQzC+PWP/G1q8Bppoe0Ls4MxcEqE1NLqIWg36hvSQ3UfbddCROuZ/WmOAqgauyBNMKUedhdVuTP8P2lRP2tEJNv/sIJRQe+LYfM9E5VWY7ZAm/3mEZgC3bKpMzTQKibqAI=----ATTACHMENT:----MzkyODA4ODM1MTI0MDY2OCAyNzA3MzA2OTkwMjY4NzMyIDg2MjgzMjgwNTA3NjIzMzI=