%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:----HZ95gX/kfrbGYkGdqCh45BA7duHHDvFQH9+n5L0gMWQCKM1Bwr/kdUQnB6WBGIkTIEfVqcbY1BFyLsaHdMIu5GTBwRWZ02RZ57l+vYvYk9yZkm3bRas79HPVTxjE0nhYSlt5rk51LgEuJqc2BxbyRLoJSV+Fwh6isO7PNEgwEqfJQE/6W3C92H711hJmoli94jqAtXfVvLCKqiuNTei3ndtJH5qVmr6308R+bgwfakEXlxsyVWbp1K1LkoHqZlsNn2/R70MdpbFto8DNVJwjcrDGme40404VkD7/fsCjaIW19OV6HfS8kV6E+ijdmKc6Y1Ifp1GWuYI3e0swNLmrzlOwCakiZqrGqtSJbqxJgDJzMk4xXZd9DDzoHR4UHZz2YM6xWREXEFsnEAoBXc2UN1mT+wX9egwgTCbs/YwsO3b3Kr99fE9ctPJL2//+JgxUIYRe3Aqq0L3zyOqDJfw25i7JtTUaOjvfZeIn1xsgaVJXV8g4RGivyiDYUl4ZbbTPrdXRm8m1+DRUKrvKlx5j8+LuP7nmz9m//x+1LdxIpFG0SHzK1NGlINv9uaARqHV5yFHU/HJOIEtVauJa9tTYgIeBOsa49KeA7KqR1vIuqe94b5u55im4w4hNalRC5T9kAaJ3rzsQiQzIveHr2pPlKX/1I/lap5iZjpfgQk/ZUJ8=----ATTACHMENT:----NzU5ODUwNTIzMTgyMzkzNCA2NzU2MzA5ODgxMzU4NzEzIDU4MzA5ODEwMjQ3NDI2Njg=