Reflection di PHP

Nette\Utils\Reflection è una classe statica che offre utili funzioni per la reflection di PHP. Il suo scopo è colmare le lacune delle classi native di reflection e uniformare il comportamento tra le diverse versioni di PHP.

Installazione:

composer require nette/utils

Tutti gli esempi presuppongono che sia definito questo alias di classe:

use Nette\Utils\Reflection;

areCommentsAvailable(): bool

Controlla se la reflection ha accesso ai commenti PHPdoc. I commenti possono non essere disponibili a causa della cache degli opcode, vedi per esempio la direttiva opcache.save-comments.

expandClassName (string $name, ReflectionClass $context)string

Espande il nome di classe $name nel suo nome pienamente qualificato nel contesto della classe $context, tenendo conto del suo namespace e degli alias definiti. In sostanza stabilisce come il parser di PHP interpreterebbe $name se fosse scritto nel corpo della classe $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

Restituisce la reflection del metodo che contiene la dichiarazione effettiva di $method. Di norma un metodo è la propria dichiarazione, ma il corpo del metodo può provenire da un trait ed eventualmente avere un nome diverso.

Poiché PHP non fornisce informazioni sufficienti per determinare in modo affidabile la vera dichiarazione, Nette usa una propria euristica, che dovrebbe essere affidabile.

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

Restituisce il valore predefinito di un parametro di funzione o di metodo. A differenza del nativo ReflectionParameter::getDefaultValue(), risolve correttamente anche le costanti e le costanti di classe usate come valore predefinito. Se la costante non si può risolvere, solleva una \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

Restituisce la reflection della classe o del trait che contiene la dichiarazione della proprietà $prop. La proprietà può essere dichiarata dentro un trait.

Poiché PHP non fornisce informazioni sufficienti per determinare in modo affidabile la vera dichiarazione, Nette usa una propria euristica, che non è del tutto affidabile.

trait DemoTrait
{
	public $foo;
}


class DemoClass
{
	use DemoTrait;
}

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

getUseStatements (ReflectionClass $class)array

Restituisce un array delle istruzioni use (gli alias) del file in cui è definita la classe $class. Le chiavi sono gli alias, i valori sono i nomi di classe pienamente qualificati. Richiede l'estensione PHP 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

Controlla se $type è un tipo integrato di PHP. In caso contrario è considerato un nome di classe.

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

Usate Nette\Utils\Validators::isBuiltinType().

toString ($reflection): string

Converte un oggetto di reflection in una stringa leggibile.

$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'
versione: 4.x