PHP-Reflection

Nette\Utils\Reflection ist eine statische Klasse mit nützlichen Funktionen für die PHP-Reflection. Ihr Zweck ist es, Schwächen der nativen Reflection-Klassen auszugleichen und das Verhalten über verschiedene PHP-Versionen hinweg zu vereinheitlichen.

Installation:

composer require nette/utils

Alle Beispiele setzen voraus, dass dieser Klassen-Alias definiert ist:

use Nette\Utils\Reflection;

areCommentsAvailable(): bool

Prüft, ob die Reflection Zugriff auf die PHPdoc-Kommentare hat. Die Kommentare können wegen des Cachings von Opcode fehlen, siehe zum Beispiel die Direktive opcache.save-comments.

expandClassName (string $name, ReflectionClass $context)string

Erweitert den Klassennamen $name im Kontext der Klasse $context zu seinem vollständig qualifizierten Namen und berücksichtigt dabei deren Namespace und die definierten Aliase. Im Grunde ermittelt sie, wie der PHP-Parser $name interpretieren würde, stünde er im Körper der Klasse $context.

namespace Foo;
use Bar;

class DemoClass
{
	// new Bar, new Baz
}

$context = new ReflectionClass(Foo\DemoClass::class);
Reflection::expandClassName('Bar', $context); // 'Bar'
Reflection::expandClassName('Baz', $context); // 'Foo\Baz'

getMethodDeclaringMethod (ReflectionMethod $method): ReflectionMethod

Gibt die Reflection der Methode zurück, die die tatsächliche Deklaration von $method enthält. Üblicherweise ist eine Methode ihre eigene Deklaration, der Körper der Methode kann aber aus einem Trait stammen und dort womöglich einen anderen Namen tragen.

Weil PHP nicht genug Informationen liefert, um die wahre Deklaration verlässlich zu bestimmen, verwendet Nette eine eigene Heuristik, die verlässlich sein sollte.

trait DemoTrait
{
	function foo()
	{
	}
}


class DemoClass
{
	use DemoTrait {
		DemoTrait::foo as foo2;
	}
}


$method = new ReflectionMethod('DemoClass::foo2');
Reflection::getMethodDeclaringMethod($method); // ReflectionMethod('DemoTrait::foo')

getParameterDefaultValue (\ReflectionParameter $param)mixed

Gibt den Standardwert eines Parameters einer Funktion oder Methode zurück. Anders als das native ReflectionParameter::getDefaultValue() löst sie auch Konstanten und Klassenkonstanten korrekt auf, die als Standardwert verwendet werden. Lässt sich die Konstante nicht auflösen, wirft sie eine \ReflectionException.

class DemoClass
{
	const DefaultValue = 123;
}

function demo($param = DemoClass::DefaultValue)
{
}

$param = new ReflectionParameter('demo', 'param');
echo Reflection::getParameterDefaultValue($param); // 123

getPropertyDeclaringClass (ReflectionProperty $prop): ReflectionClass

Gibt die Reflection der Klasse oder des Traits zurück, die die Deklaration der Property $prop enthält. Die Property kann in einem Trait deklariert sein.

Weil PHP nicht genug Informationen liefert, um die wahre Deklaration verlässlich zu bestimmen, verwendet Nette eine eigene Heuristik, die nicht vollständig verlässlich ist.

trait DemoTrait
{
	public $foo;
}


class DemoClass
{
	use DemoTrait;
}

$prop = new ReflectionProperty(DemoClass::class, 'foo');
Reflection::getPropertyDeclaringClass($prop); // ReflectionClass('DemoTrait')

getUseStatements (ReflectionClass $class)array

Gibt ein Array der use-Anweisungen (Aliase) aus der Datei zurück, in der die Klasse $class definiert ist. Die Schlüssel sind die Aliase, die Werte die vollständig qualifizierten Klassennamen. Erfordert die PHP-Erweiterung tokenizer.

namespace Foo;

use Nette\Utils\Strings;
use Nette\Utils\Arrays as Arr;

class DemoClass
{
}

$class = new ReflectionClass(Foo\DemoClass::class);
Reflection::getUseStatements($class);
// ['Strings' => 'Nette\Utils\Strings', 'Arr' => 'Nette\Utils\Arrays']

isBuiltinType (string $type)bool

Prüft, ob $type ein in PHP eingebauter Typ ist. Andernfalls gilt er als Klassenname.

Reflection::isBuiltinType('string'); // true
Reflection::isBuiltinType('Foo');    // false

Verwenden Sie Nette\Utils\Validators::isBuiltinType().

toString ($reflection): string

Wandelt ein Reflection-Objekt in einen für Menschen lesbaren String um.

$func = new ReflectionFunction('func');
echo Reflection::toString($func); // 'func()'

$class = new ReflectionClass('DemoClass');
echo Reflection::toString($class); // 'DemoClass'

$method = new ReflectionMethod('DemoClass', 'foo');
echo Reflection::toString($method); // 'DemoClass::foo()'

$param = new ReflectionParameter(['DemoClass', 'foo'], 'param');
echo Reflection::toString($param); // '$param in DemoClass::foo()'

$prop = new ReflectionProperty('DemoClass', 'foo');
echo Reflection::toString($prop); // 'DemoClass::$foo'
Version: 4.x