Menu
CoddyTech

__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, World

Untuk 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.com

Magic 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.

challenge icon

Tantangan

Mudah

Mari 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 class ApiClient yang menyimulasikan interaksi API menggunakan magic method. Class-mu harus memiliki property $baseUrl privat yang diatur melalui constructor. Implementasikan dua magic method:
    • __call(): Menangani pemanggilan method instance. Saat method yang diawali get dipanggil (seperti getUsers atau getPosts), 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 diawali create dipanggil (seperti createUser), ambil nama resource dan kembalikan "POST /[resource]: [arguments joined by comma]". Nama resource harus berupa huruf kecil. Untuk method yang diawali delete, 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 instance ApiClient dengan URL dasar tersebut. Lalu cetak empat baris:
    • Panggil method get dinamis dengan pengenal resource sebagai akhiran nama method (misalnya, jika resource-nya "Users", panggil getUsers) dan gunakan nilai sebagai argumen
    • Panggil getProducts dengan dua argumen: "electronics" dan "active"
    • Panggil method statis createOrder dengan nilai sebagai argumen
    • Panggil method statis deleteItem dengan pengenal resource sebagai argumen

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

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online