Menu
Coddy logo textTech

__call ve __callStatic

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 47 / 91.

Tıpkı __get() ve __set() özellik erişimini engellediği gibi, __call() ve __callStatic() yöntemleri de yöntem çağrılarını engeller. Bir nesne veya sınıf üzerinde var olmayan ya da erişilemeyen bir yöntemi çağırdığınızda tetiklenirler.

__call() yöntemi, örnek yöntem çağrılarını işler. Yöntem adını ve bir bağımsız değişken dizisini alır:

<?php
class Messenger {
    public function __call(string $name, array $arguments): string {
        return "Called '$name' with: " . implode(", ", $arguments);
    }
}

$msg = new Messenger();
echo $msg->sendEmail("Hello", "World");

Çıktı:

Called 'sendEmail' with: Hello, World

Statik yöntem çağrıları için __callStatic() kullanın. Bunun static olarak tanımlanması gerektiğine dikkat edin:

<?php
class QueryBuilder {
    public static function __callStatic(string $name, array $arguments): string {
        if (str_starts_with($name, "findBy")) {
            $field = substr($name, 6);
            return "Finding by $field: " . $arguments[0];
        }
        return "Unknown method: $name";
    }
}

echo QueryBuilder::findByEmail("test@example.com");

Çıktı:

Finding by Email: test@example.com

Bu sihirli metotlar, akıcı API'ler oluşturmak, metot yönlendirmesi uygulamak veya metot adlarının veritabanı işlemlerine dönüştüğü dinamik sorgu oluşturucular geliştirmek için güçlüdür. Nesnelerinizin, açıkça tanımlamadığınız metot çağrıları da dâhil olmak üzere, herhangi bir metot çağrısına akıllıca yanıt vermesini sağlarlar.

challenge icon

Görev

Kolay

Yöntem çağrılarını esnek bir şekilde işlemek için sihirli yöntemleri kullanan dinamik bir API istemcisi oluşturalım. Her yöntemi açıkça tanımlamadan hem örnek hem de statik yöntem çağrılarını yakalayan ve bunları anlamlı API benzeri yanıtlarına dönüştüren bir sınıf oluşturacaksınız.

Kodunuzu iki dosya arasında düzenleyeceksiniz:

  • ApiClient.php: Sihirli yöntemleri kullanarak API etkileşimlerini taklit eden bir ApiClient sınıfı oluşturun. Sınıfınızda, oluşturucu aracılığıyla ayarlanan özel bir $baseUrl özelliği bulunmalıdır. İki sihirli yöntem uygulayın:
    • __call(): Örnek yöntem çağrılarını işler. get ile başlayan bir yöntem çağrıldığında (getUsers veya getPosts gibi), kaynak adını ("get"ten sonraki kısmı) çıkarın ve "GET [baseUrl]/[resource]: [arguments joined by comma]" döndürün. Kaynak adı küçük harfe dönüştürülmelidir. Yöntem "get" ile başlamıyorsa "Unknown action: [methodName]" döndürün.
    • __callStatic(): Statik yöntem çağrılarını işler. create ile başlayan bir yöntem çağrıldığında (createUser gibi), kaynak adını çıkarın ve "POST /[resource]: [arguments joined by comma]" döndürün. Kaynak adı küçük harf olmalıdır. delete ile başlayan yöntemler için "DELETE /[resource]: [first argument]" döndürün. Diğer tüm yöntemler için "Static action not supported: [methodName]" döndürün.
  • main.php: ApiClient dosyasını dahil edin. Üç girdi alacaksınız: bir temel URL, bir kaynak tanımlayıcısı ve bir değer. Temel URL ile bir ApiClient örneği oluşturun. Ardından dört satır yazdırın:
    • Kaynak tanımlayıcısını yöntem adı son eki olarak kullanarak dinamik bir get yöntemi çağırın (örneğin, kaynak "Users" ise getUsers çağrısını yapın); değer de bağımsız değişken olarak kullanılsın
    • getProducts yöntemini iki bağımsız değişkenle çağırın: "electronics" ve "active"
    • Statik createOrder yöntemini değeri bağımsız değişken olarak kullanarak çağırın
    • Statik deleteItem yöntemini kaynak tanımlayıcısını bağımsız değişken olarak kullanarak çağırın

Sihirli yöntemler, API istemcinizin herhangi bir yöntem çağrısına dinamik olarak yanıt vermesini sağlar. getUsers(), getPosts(), getProducts() ve onlarca başka yöntemi tanımlamak yerine, tek bir __call() yöntemi yöntem adını inceleyip ilgili bilgileri çıkararak hepsini işler.

Kendin dene

<?php

require_once 'ApiClient.php';

// Girdileri oku
$baseUrl = trim(fgets(STDIN));
$resource = trim(fgets(STDIN));
$value = trim(fgets(STDIN));

// TODO: Temel URL ile bir ApiClient örneği oluştur

// TODO: Kaynağı metot adı soneki olarak kullanarak dinamik bir get metodu çağır
// Hint: $api->{"get" . $resource}($value) gibi değişken metot çağrıları kullan

// TODO: getProducts metodunu iki argümanla çağır: "electronics" ve "active"

// TODO: createOrder statik metodunu value argümanıyla çağır
// Hint: ApiClient::createOrder($value) kullan

// TODO: deleteItem statik metodunu resource argümanıyla çağır

?>
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online PHP derleyicisi