__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, WorldStatik 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.comBu 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.
Görev
KolayYö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 birApiClientsı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.getile başlayan bir yöntem çağrıldığında (getUsersveyagetPostsgibi), 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.createile başlayan bir yöntem çağrıldığında (createUsergibi), kaynak adını çıkarın ve"POST /[resource]: [arguments joined by comma]"döndürün. Kaynak adı küçük harf olmalıdır.deleteile 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 birApiClientö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
getyöntemi çağırın (örneğin, kaynak "Users" isegetUsersçağrısını yapın); değer de bağımsız değişken olarak kullanılsın getProductsyöntemini iki bağımsız değişkenle çağırın:"electronics"ve"active"- Statik
createOrderyöntemini değeri bağımsız değişken olarak kullanarak çağırın - Statik
deleteItemyöntemini kaynak tanımlayıcısını bağımsız değişken olarak kullanarak çağırın
- Kaynak tanımlayıcısını yöntem adı son eki olarak kullanarak dinamik bir
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
?>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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi