PHP Reflection

Nette\Utils\Reflection, PHP reflection'ı için kullanışlı fonksiyonlar sunan statik bir sınıftır. Amacı, yerleşik reflection sınıflarının eksiklerini gidermek ve farklı PHP sürümlerindeki davranışı tek biçime getirmektir.

Kurulum:

composer require nette/utils

Tüm örnekler, aşağıdaki sınıf takma adının tanımlandığını varsayar:

use Nette\Utils\Reflection;

areCommentsAvailable(): bool

Reflection'ın PHPdoc yorumlarına erişip erişemediğini denetler. Yorumlar, opcode önbelleklemesi nedeniyle erişilemez olabilir; örneğin opcache.save-comments yönergesine bakın.

expandClassName (string $name, ReflectionClass $context)string

$name sınıf adını, $context sınıfının isim alanını ve tanımlı takma adlarını göz önünde bulundurarak o bağlamdaki tam nitelikli adına genişletir. Özünde, $name $context sınıfının gövdesinde yazılmış olsaydı PHP ayrıştırıcısının onu nasıl yorumlayacağını belirler.

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

$method metodunun asıl bildirimini içeren metodun reflection'ını döndürür. Genellikle bir metot kendi bildirimidir, ancak metot gövdesi bir trait'ten ve olasılıkla başka bir adla geliyor olabilir.

PHP, gerçek bildirimi güvenilir şekilde belirlemeye yetecek bilgi sunmadığından Nette kendi sezgisel yöntemini kullanır; bu yöntem güvenilir olmalıdır.

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

Bir fonksiyon ya da metot parametresinin varsayılan değerini döndürür. Yerleşik ReflectionParameter::getDefaultValue() metodunun aksine, varsayılan değer olarak kullanılan sabitleri ve sınıf sabitlerini de doğru şekilde çözer. Sabit çözülemezse \ReflectionException fırlatır.

class DemoClass
{
	const DefaultValue = 123;
}

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

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

getPropertyDeclaringClass (ReflectionProperty $prop): ReflectionClass

$prop özelliğinin bildirimini içeren sınıfın ya da trait'in reflection'ını döndürür. Özellik bir trait içinde bildirilmiş olabilir.

PHP, gerçek bildirimi güvenilir şekilde belirlemeye yetecek bilgi sunmadığından Nette kendi sezgisel yöntemini kullanır; bu yöntem tümüyle güvenilir değildir.

trait DemoTrait
{
	public $foo;
}


class DemoClass
{
	use DemoTrait;
}

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

getUseStatements (ReflectionClass $class)array

$class sınıfının tanımlandığı dosyadaki use deyimlerinden (takma adlardan) oluşan bir dizi döndürür. Anahtarlar takma adlar, değerler tam nitelikli sınıf adlarıdır. tokenizer PHP eklentisini gerektirir.

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

$type değerinin PHP'nin yerleşik türlerinden biri olup olmadığını denetler. Değilse sınıf adı sayılır.

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

Nette\Utils\Validators::isBuiltinType() kullanın.

toString ($reflection): string

Bir reflection nesnesini insan tarafından okunabilir bir dizeye dönüştürür.

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