Reflection API предоставляет возможности для исследования классов, интерфейсов, функций, методов и расширений во время выполнения. Это своеобразное "зеркало" для вашего кода.
$classInfo = new ReflectionClass('ClassName');
echo "Class name: " . $classInfo->getName() . "\n";
echo "Is abstract: " . ($classInfo->isAbstract() ? 'Yes' : 'No') . "\n";
echo "Methods: " . implode(', ', $classInfo->getMethods()) . "\n";
$method = new ReflectionMethod('ClassName', 'methodName');
echo "Method name: " . $method->getName() . "\n";
echo "Parameters: " . $method->getNumberOfParameters() . "\n";
echo "Is public: " . ($method->isPublic() ? 'Yes' : 'No') . "\n";
$property = new ReflectionProperty('ClassName', 'propertyName');
echo "Property name: " . $property->getName() . "\n";
echo "Is static: " . ($property->isStatic() ? 'Yes' : 'No') . "\n";
function generateClassDocs($className) {
$reflection = new ReflectionClass($className);
$docs = "# Documentation for " . $reflection->getName() . "\n\n";
$docs .= "## Methods\n\n";
foreach ($reflection->getMethods() as $method) {
$docs .= "### " . $method->getName() . "()\n";
$docs .= $method->getDocComment() . "\n\n";
}
return $docs;
}
class Container {
public function resolve($className) {
$reflection = new ReflectionClass($className);
if (!$reflection->isInstantiable()) {
throw new Exception("Class {$className} is not instantiable");
}
$constructor = $reflection->getConstructor();
if (is_null($constructor)) {
return new $className;
}
$parameters = $constructor->getParameters();
$dependencies = [];
foreach ($parameters as $parameter) {
$dependency = $parameter->getClass();
if (is_null($dependency)) {
if ($parameter->isDefaultValueAvailable()) {
$dependencies[] = $parameter->getDefaultValue();
} else {
throw new Exception("Cannot resolve dependency");
}
} else {
$dependencies[] = $this->resolve($dependency->getName());
}
}
return $reflection->newInstanceArgs($dependencies);
}
}
class TestHelper {
public static function callPrivateMethod($object, $methodName, array $args = []) {
$reflection = new ReflectionClass(get_class($object));
$method = $reflection->getMethod($methodName);
$method->setAccessible(true);
return $method->invokeArgs($object, $args);
}
}
function analyzeFunction($functionName) {
$reflection = new ReflectionFunction($functionName);
foreach ($reflection->getParameters() as $param) {
echo "Parameter: " . $param->getName() . "\n";
echo "Type: " . ($param->hasType() ? $param->getType() : 'mixed') . "\n";
echo "Optional: " . ($param->isOptional() ? 'Yes' : 'No') . "\n\n";
}
}
$class = new ReflectionClass('ClassName');
$traits = $class->getTraits();
foreach ($traits as $trait) {
echo "Trait: " . $trait->getName() . "\n";
}
$func = function($a, $b) { return $a + $b; };
$reflection = new ReflectionFunction($func);
echo "Closure has " . $reflection->getNumberOfParameters() . " parameters";
Производительность:
Безопасность:
Альтернативы:
function_exists
, method_exists
Кэширование результатов:
$cache = [];
function getCachedClassInfo($className) {
global $cache;
if (!isset($cache[$className])) {
$cache[$className] = new ReflectionClass($className);
}
return $cache[$className];
}
Использование только когда необходимо:
Комбинирование с другими технологиями:
Reflection API — это мощный инструмент для метапрограммирования в PHP, который открывает возможности для создания гибких и умных приложений. Однако его следует использовать осмотрительно, учитывая влияние на производительность и безопасность. Наиболее полезен при создании фреймворков, ORM, DI-контейнеров и инструментов для разработки.