%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:----vuc0/kSEn/OxpNCgL6pus9qp823Ax/JD8QgERjBwPpP73dG2mJD3PIU3HNMcMbSEmgjWTHugCem7geOnkBCOagNcC0zixlctKvYj549N7kiitnb/9TXRSungVOLOXUbYlE3+xGKpIiPUq+W1OU6hJAygFdDFpg2eKF3rKZI0I+M6zhy/WspMDPtGHbw1zsEH9wdSC+x/IkzBpez3pg2TrNtJtEXG8W61ECQZQxLo9WO52170/AJSremD60lbe9Vv0ifKzHuopA06ozi/+XP+5FXgIbl+disinIIyn3AacUo6+RtNRaZtnPL4gdGUc7QyYj0En+Ei88todDwDiAiWBAv2wzU0kW0f26qvsBEwXYYPks8wqy24j52IR0Pj/q4cPlgDwB7T98JOBVjAQ80U/pBhjar2E6/eD0vZvrAIrErlPAm7CGmB1g2OKHT9n2jTWirgseTsB4DhVxjW6/MAE0Vjbpk+oLqBbFQdknQ8DWO4HMh4CKUXfeOWSSbr3LYhpwHat1KnPkMJd8KNTF4S8wicwA+p5bAzcvyDeSVP95xs3FS/u1iwxFKoFyzMT+Dq5mWJ2e+hxTmMGETlbW8RyuabT5F9aIioRFKlfwMBa6Bs8RS4HENGpOewq1pcwWbvxHKGbnn7kd46XS29OmiHyBtK8swsOfhKGJgB+Krlgjk=----ATTACHMENT:----OTM4NzM0NzU0Nzk2OTg2OCA4ODgwNjA3NTgzNzAwMTg5IDEwMTMxMDA5OTA3NTIwMzU=