When building tools that inspect PHP code, ReflectionFunctionAbstract::getReturnType() helps answer a focused question: returns a declared ReflectionType for the function or null if undeclared.
Reflection is useful in framework tooling, dependency injection, testing, code inspection and debugging.
What Is ReflectionFunctionAbstract::getReturnType()?
Returns a declared ReflectionType for the function or null if undeclared.
Its method signature is:
public function getReturnType(): ?ReflectionType
This method has no required arguments.
Return value: ?ReflectionType
Example 1: Inspect a function or callable
Start with a self-contained PHP declaration and inspect the method result.
<?php
declare(strict_types=1);
#[Attribute(Attribute::TARGET_FUNCTION | Attribute::TARGET_METHOD | Attribute::TARGET_PARAMETER)]
class FunctionMarker { public function __construct(public string $label) {} }
/** Formats one price for a product listing. */
#[FunctionMarker('currency')]
function formatPrice(float $amount, string $currency = 'USD'): string {
return $currency . ' ' . number_format($amount, 2);
}
function logMessages(string ...$messages): string { return implode(', ', $messages); }
function &returnReference(array &$values): array { return $values; }
function valuesFromGenerator(): Generator { yield 10; yield 20; }
class FormatterService {
public function label(int $id): string { return '#' . $id; }
public static function uppercase(string $message): string { return strtoupper($message); }
}
$functionReflection = new ReflectionFunction("formatPrice");
$result = $functionReflection->getReturnType();
echo $result === null ? "none" : (string)$result;
Output:
string
Explanation: Returns a declared ReflectionType for the function or null if undeclared.
Example 2: Compare a different callable
Next, change the reflected declaration or parameter to observe a related situation.
<?php
declare(strict_types=1);
#[Attribute(Attribute::TARGET_FUNCTION | Attribute::TARGET_METHOD | Attribute::TARGET_PARAMETER)]
class FunctionMarker { public function __construct(public string $label) {} }
/** Formats one price for a product listing. */
#[FunctionMarker('currency')]
function formatPrice(float $amount, string $currency = 'USD'): string {
return $currency . ' ' . number_format($amount, 2);
}
function logMessages(string ...$messages): string { return implode(', ', $messages); }
function &returnReference(array &$values): array { return $values; }
function valuesFromGenerator(): Generator { yield 10; yield 20; }
class FormatterService {
public function label(int $id): string { return '#' . $id; }
public static function uppercase(string $message): string { return strtoupper($message); }
}
$functionReflection = new ReflectionFunction("logMessages");
$result = $functionReflection->getReturnType();
echo $result === null ? "none" : (string)$result;
// Check the returned value type before using the result.
echo "\nResult type: " . get_debug_type($result);
Output:
string
Result type: ReflectionNamedType
Explanation: Missing return types are not the same as mixed return types.
Practical Example: Use reflection in validation or tooling
This final case shows how the same API can be used when inspecting application definitions.
<?php
declare(strict_types=1);
#[Attribute(Attribute::TARGET_FUNCTION | Attribute::TARGET_METHOD | Attribute::TARGET_PARAMETER)]
class FunctionMarker { public function __construct(public string $label) {} }
/** Formats one price for a product listing. */
#[FunctionMarker('currency')]
function formatPrice(float $amount, string $currency = 'USD'): string {
return $currency . ' ' . number_format($amount, 2);
}
function logMessages(string ...$messages): string { return implode(', ', $messages); }
function &returnReference(array &$values): array { return $values; }
function valuesFromGenerator(): Generator { yield 10; yield 20; }
class FormatterService {
public function label(int $id): string { return '#' . $id; }
public static function uppercase(string $message): string { return strtoupper($message); }
}
$functionReflection = new ReflectionFunction("strtoupper");
$result = $functionReflection->getReturnType();
echo $result === null ? "none" : (string)$result;
// Use the reflection result in a simple decision.
if (is_bool($result)) {
echo "\nStatus: " . ($result ? "yes" : "no");
} elseif (is_array($result)) {
echo "\nEntries: " . count($result);
} elseif ($result === null) {
echo "\nNo value returned";
} else {
echo "\nReflection result available";
}
Output:
string
Reflection result available
Explanation: hasReturnType checks for a declaration without retrieving the object.
Important Behavior and Edge Cases
- Missing return types are not the same as mixed return types.
- hasReturnType checks for a declaration without retrieving the object.
- Reflection describes declarations and runtime state; requesting metadata does not automatically validate or sanitize application input.
Comparison With Related Approaches
| Approach | When to Use It |
|---|---|
ReflectionFunctionAbstract::getReturnType() | Returns a declared ReflectionType for the function or null if undeclared. |
Related API | hasReturnType checks for a declaration without retrieving the object. |
Common Beginner Mistakes
| Mistake | Correct Approach |
|---|---|
| Ignoring this condition: Missing return types are not the same as mixed return types. | Handle the specific limitation: Missing return types are not the same as mixed return types. |
| Confusing this method with Related API | hasReturnType checks for a declaration without retrieving the object. |
Key Takeaways
- Returns a declared ReflectionType for the function or null if undeclared.
- Missing return types are not the same as mixed return types.
- hasReturnType checks for a declaration without retrieving the object.
Use ReflectionFunctionAbstract::getReturnType() when you need the precise metadata or behavior demonstrated above. Keep the target declaration and relevant PHP version in mind when adapting the examples.