__call Metodu

__call metodu, PHP'de bir sınıfta var olmayan veya erişilemeyen bir metot çağrıldığında otomatik olarak tetiklenen büyülü bir metottur. İlk parametresi çağrılan metodun adını, ikinci parametresi ise argümanların bir dizisini alır.

Sözdizimi

phppublic function __call(string $name, array $arguments) {
  // uygulama
}

Örnek

__call metoduna sahip bir sınıf oluşturalım, bu sınıf var olmayan tüm metot çağrılarını yakalayacak:

php<?php
  class Test {
    public function __call($name, $args) {
      echo "Çağrılan metot: " . $name . "\n";
      echo "Argümanlar: ";
      print_r($args);
    }
  }
  
  $test = new Test();
  $test->nonExistentMethod('a', 'b', 123);
?>

Kodun çalıştırılmasının sonucu:

phpÇağrılan metot: nonExistentMethod
Argümanlar: ['a', 'b', 123]

Örnek

__call kullanarak basit bir metot delegetörü uygulayalım:

php<?php
  class Calculator {
    public function add($a, $b) {
      return $a + $b;
    }
  }
  
  class Math {
    private $calculator;
    
    public function __construct() {
      $this->calculator = new Calculator();
    }
    
    public function __call($name, $args) {
      if (method_exists($this->calculator, $name)) {
        return call_user_func_array(
          [$this->calculator, $name],
          $args
        );
      }
      throw new Exception("$name metodu bulunamadı");
    }
  }
  
  $math = new Math();
  echo $math->add(2, 3);
?>

Kodun çalıştırılmasının sonucu:

php5

Ayrıca Bakınız

  • statik metot çağrılarını yakalayan
    __callStatic metodu
  • var olmayan özelliklere erişimi yakalayan
    __get metodu