__call & __callStatic
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 47 dari 91.
Sama seperti __get() dan __set() mencegat akses property, method __call() dan __callStatic() mencegat pemanggilan method. Keduanya terpicu saat kamu memanggil method yang tidak ada atau tidak dapat diakses pada object atau class.
method __call() menangani pemanggilan method instance. method ini menerima nama method dan array argumen:
<?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");
Output:
Called 'sendEmail' with: Hello, WorldUntuk pemanggilan method statis, gunakan __callStatic(). Perhatikan bahwa method ini harus dideklarasikan sebagai static:
<?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");
Output:
Finding by Email: test@example.comMagic method ini berguna untuk membuat API yang lancar, menerapkan penerusan method, atau membangun query builder dinamis yang menerjemahkan nama method menjadi operasi database. Dengan magic method, object-mu dapat merespons setiap pemanggilan method dengan cerdas, termasuk method yang belum kamu definisikan secara eksplisit.
Tantangan
MudahMari buat client API dinamis yang menggunakan magic method untuk menangani pemanggilan method secara fleksibel. Kamu akan membuat class yang mencegat pemanggilan method instance dan statis, lalu mengubahnya menjadi respons mirip API yang bermakna tanpa mendefinisikan setiap method secara eksplisit.
Kamu akan menyusun kodemu dalam dua file:
ApiClient.php: Buat classApiClientyang menyimulasikan interaksi API menggunakan magic method. Class-mu harus memiliki property$baseUrlprivat yang diatur melalui constructor. Implementasikan dua magic method:__call(): Menangani pemanggilan method instance. Saat method yang diawaligetdipanggil (sepertigetUsersataugetPosts), ambil nama resource (bagian setelah "get") dan kembalikan"GET [baseUrl]/[resource]: [arguments joined by comma]". Nama resource harus diubah menjadi huruf kecil. Jika nama method tidak diawali "get", kembalikan"Unknown action: [methodName]".__callStatic(): Menangani pemanggilan method statis. Saat method yang diawalicreatedipanggil (seperticreateUser), ambil nama resource dan kembalikan"POST /[resource]: [arguments joined by comma]". Nama resource harus berupa huruf kecil. Untuk method yang diawalidelete, kembalikan"DELETE /[resource]: [first argument]". Untuk method lainnya, kembalikan"Static action not supported: [methodName]".
main.php: Sertakan file ApiClient. Kamu akan menerima tiga input: URL dasar, pengenal resource, dan nilai. Buat instanceApiClientdengan URL dasar tersebut. Lalu cetak empat baris:- Panggil method
getdinamis dengan pengenal resource sebagai akhiran nama method (misalnya, jika resource-nya "Users", panggilgetUsers) dan gunakan nilai sebagai argumen - Panggil
getProductsdengan dua argumen:"electronics"dan"active" - Panggil method statis
createOrderdengan nilai sebagai argumen - Panggil method statis
deleteItemdengan pengenal resource sebagai argumen
- Panggil method
Magic method memungkinkan client API-mu merespons pemanggilan method apa pun secara dinamis. Alih-alih mendefinisikan getUsers(), getPosts(), getProducts(), dan puluhan method lainnya, satu method __call() menangani semuanya dengan memeriksa nama method dan mengambil informasi yang relevan.
Coba sendiri
<?php
require_once 'ApiClient.php';
// Baca input
$baseUrl = trim(fgets(STDIN));
$resource = trim(fgets(STDIN));
$value = trim(fgets(STDIN));
// TODO: Buat instance ApiClient dengan URL dasar
// TODO: Panggil method get dinamis dengan resource sebagai akhiran nama method
// Petunjuk: Gunakan pemanggilan method melalui variabel seperti $api->{"get" . $resource}($value)
// TODO: Panggil getProducts dengan dua argumen: "electronics" dan "active"
// TODO: Panggil method statis createOrder dengan nilai sebagai argumen
// Petunjuk: Gunakan ApiClient::createOrder($value)
// TODO: Panggil method statis deleteItem dengan resource sebagai argumen
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online