%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:----EGsgD8OAWd6qogB6+D1wwKrXo3QUseT6RhGIPYWCqb9HZXYH36TeDhfZCO9uBsxAOINGgPOlsVNj8lTaxy++spzv/1sRhLm+3zjgQKzglaTSqHV9MFAU9CikwSLo83IMByw5ZykBSjhO9ZBT5z2hUy0+m7+HKjZBUrv8jQXV3IrI7AlgpVs2dmcSFR8vmY7xTKqIb/i/RPapFcHxROEemmI9351xl9mDNFeGssoicJMmTyWY3uEiTY63jJvUA0NGVa1LZK+QhlMbNbMpRWZOASxfYd81jNVZETud4rbYYY6kwZmWZNV+Tkl/sBektvXIXWNwSkWXALQ0xbUwNDCWDv61aT3p/lYxzZ64poLHw9TwFaNeIevP7wR7wb35SDZ3v6bT0M7nzBEz3xMy5c1iEUei6Ph19JeZTHV8nxjaHCBVtbJqE0A/9KYEixxf8PeYeWgS0/tYcU6kRwUhB5TT565CHQgeF1cSrDKHj+WksDbKSE5QQ0b9EpUIG33pXw0zB51w+uJz0rbvVgGWsFiOpGEax5NtXZ/ckbgsiBIQsUo28b7R6RUYUY2A6+Q5D8AjIsfopYEuySz47W6+eR6rgJTJnVUC1miWWfXwLzYWkt7+PSBo+LCkfrwNpQWx10gOrzPWungPjbRLQmNz+qRqW3IrChgYUe0iEmrfeTDlUu8=----ATTACHMENT:----NDcwNzAwNTA1OTk3MzM4MiA5MDQzMjE3OTY3NTM1NjY2IDIxNDMxODA2OTc4MjI4MjI=