CodeBlanks Logo Icon CodeBlanks

Dinamik metot çağrısı

PHP kursu · Uzman · Ders 20/54

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

  1. 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";
    
  2. 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
  3. 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.

Uzman bölümündeki tüm dersler