Özniteliklerin Yansıtma Arayüzü ile Okunması
Sınıflar, yöntemler, işlevler, bağımsız değişkenler, özellikler ve sınıf
sabitlerinden özniteliklere erişmek için kullanılan yansıtma arayüzü, ilgili
Reflection nesnelerinin her birine getAttributes()
yöntemini sağlar. Bu yöntem, öznitelik adı, bağımsız değişkenler ve temsil
edilen özniteliğin bir örneğini örneklendirmek için sorgulanabilen
ReflectionAttribute örneklerini içeren bir
dizi döndürür.
Yansıtılan öznitelik temsilinin gerçek örnekten bu şekilde ayrılması,
programcının eksik öznitelik sınıfları, yanlış yazılmış veya eksik
bağımsız değişkenlerle ilgili hataları elde etme konusundaki denetimini artırır.
Öznitelik sınıfının nesneleri, yalnızca
ReflectionAttribute::newInstance() çağrıldıktan sonra
başlatılırsa bağımsız değişkenlerin doğru eşleşmesi sağlanır, daha önce değil.
Örnek 1 - Özniteliklerin Yansıtma Arayüzü kullanılarak Okunması
<?php
#[Attribute]
class MyAttribute
{
public $value;
public function __construct($value)
{
$this->value = $value;
}
}
#[MyAttribute(value: 1234)]
class Thing
{
}
function dumpAttributeData($reflection) {
$attributes = $reflection->getAttributes();
foreach ($attributes as $attribute) {
var_dump($attribute->getName());
var_dump($attribute->getArguments());
var_dump($attribute->newInstance());
}
}
dumpAttributeData(new ReflectionClass(Thing::class));
/*
string(11) "MyAttribute"
array(1) {
["value"]=>
int(1234)
}
object(MyAttribute)#3 (1) {
["value"]=>
int(1234)
}
*/
Yansıtma örneğindeki tüm öznitelikleri yinelemek yerine, yalnızca belirli
bir öznitelik sınıfı, sınıfın ismi bağımsız değişken olarak aktarılarak okunabilir.
Örnek 2 - Yansıtma Arayüzünü kullanarak istenen özniteliklerin okunması
<?php
function dumpMyAttributeData($reflection) {
$attributes = $reflection->getAttributes(MyAttribute::class);
foreach ($attributes as $attribute) {
var_dump($attribute->getName());
var_dump($attribute->getArguments());
var_dump($attribute->newInstance());
}
}
dumpMyAttributeData(new ReflectionClass(Thing::class));
Hirusha Sharma ¶3 years ago
Fetch properties from functions:
----------------------------------------
Function definition with attributes:
----------------------------------------
#[ReadOnly]
#[Property(type: 'function', name: 'Hello')]
function Hello()
{
return "Hello";
}
-----------------------------------------
Gather attributes from the function
-----------------------------------------
function getAttributes(Reflector $reflection)
{
$attributes = $reflection->getAttributes();
$result = [];
foreach ($attributes as $attribute)
{
$result[$attribute->getName()] = $attribute->getArguments();
}
return $result;
}
$reflection = new ReflectionFunction("Hello");
print_r(getAttributes($reflection));
-----------------------------
OUTPUT
-----------------------------
Array
(
[ReadOnly] => Array
(
)
[Property] => Array
(
[type] => function
[name] => Hello
)
)