PHP
Dinamik metot çağrısı
Reflection ile çalışma anında method çağırmayı öğrenirsin.
invoke ile method çağırma
Reflection yalnızca bilgi okumaz; methodları çalıştırır da. ReflectionMethod::invoke($object, ...$args) ile bir methodu dışarıdan çağırırsın.
Statik olmayan method için $object gereklidir; statik methodda null geçer. invokeArgs($object, $args) parametreleri dizi olarak alır.
Bu yetenek, container ve event dispatcher gibi araçların kalbinde yatar: method adını diziden alıp çalıştırırsın.
invokeArgs ve newInstanceArgs
invokeArgs($object, [$a, $b]), parametre sayısı değişken olduğunda işe yarar. Diziyi çalışma anında kurarsın; tek tek yazmak yerine tek çağrıda geçersin.
Bir sınıfı kurarken ReflectionClass::newInstanceArgs($args) kurucuya diziyi yayar; newInstance() ise tek tek argümanları alır.
Böylece bağımlılık container'ı, kurucu parametrelerini reflection'dan çıkarıp uygun örnekleri doldurabilir. Bu, kodu elle yazmaktan çok daha esnektir.
Uygulama find methodunu invoke ile çağır
Aşağıdaki UserService::find methodu verilmiş. Bir ReflectionMethod nesnesi oluştur ve invoke() ile find(42) çağrısı yap; sonucu yazdır.
Örnek çözümü göster
$rm = new ReflectionMethod("UserService", "find"); oluştur. $result = $rm->invoke(new UserService(), 42); ile çağır. echo $result . "\n"; ile yazdır.
Örnek çözüm:
<?php
class UserService {
public function find(int $id): string {
return "user-" . $id;
}
}
$rm = new ReflectionMethod("UserService", "find");
$result = $rm->invoke(new UserService(), 42);
echo $result . "\n";
Kendini test et
-
invoke çağrısını tamamla
<?php
$rm = new ReflectionMethod("UserService", "find");
$result = $rm->____(new UserService(), 42);
echo $result . "\n";
Cevabı göster
<?php
$rm = new ReflectionMethod("UserService", "find");
$result = $rm->invoke(new UserService(), 42);
echo $result . "\n";
-
invoke kavramlarını eşleştir
- invoke
- Methodu çalıştırır
- invokeArgs
- Parametreleri dizi ile çalıştırır
- $object
- Hedef nesne (statik değilse)
- null
- Statik method hedefi
-
invokeArgs ikinci parametresi ne olmalı?
- Parametrelerin dizisi
- Tek bir parametre değeri
- Sınıf adı dizesi
- ReflectionParameter nesnesi
Cevabı göster
Parametrelerin dizisi — Doğru. invokeArgs parametreleri dizi olarak alır.
Sıradaki ders: Özet - Reflection