getMethods() as $method) { if ($method->getDeclaringClass()->getName() !== $class) { continue; } $parameters = []; foreach ($method->getParameters() as $parameter) { $parameters[] = [ 'name' => $parameter->getName(), 'reference' => $parameter->isPassedByReference(), 'variadic' => $parameter->isVariadic(), 'type' => $parameter->hasType() ? (string) $parameter->getType() : null, 'optional' => $parameter->isOptional(), 'default' => !$parameter->isDefaultValueAvailable() ? null : ($parameter->isDefaultValueConstant() ? ['constant' => $parameter->getDefaultValueConstantName()] : ['value' => $parameter->getDefaultValue()]), ]; } $contracts[$class . '::' . $method->getName()] = [ 'public' => $method->isPublic(), 'static' => $method->isStatic(), 'parameters' => $parameters, 'return' => $method->hasReturnType() ? (string) $method->getReturnType() : null, ]; } } print json_encode($contracts, JSON_THROW_ON_ERROR);