Menu
CoddyTech

__get, __set, __isset, __unset

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 46 dari 91.

PHP menyediakan empat method ajaib yang menangani akses property: __get(), __set(), __isset(), dan __unset(). Method ini dipicu saat kamu mencoba mengakses property yang tidak ada atau tidak dapat diakses.

Method __get() dipanggil saat membaca property yang tidak dapat diakses, sedangkan __set() menangani penulisan ke property tersebut. Ini memungkinkan kamu membuat property dinamis atau menambahkan logika saat property diakses:

<?php
class DynamicObject {
    private array $data = [];
    
    public function __get(string $name): mixed {
        return $this->data[$name] ?? null;
    }
    
    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }
}

$obj = new DynamicObject();
$obj->title = "Hello";
$obj->count = 42;
echo $obj->title . " - " . $obj->count;

Output:

Hello - 42

method __isset() dipicu oleh isset() atau empty(), dan __unset() merespons fungsi unset():

<?php
class DynamicObject {
    private array $data = [];
    
    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }
    
    public function __isset(string $name): bool {
        return isset($this->data[$name]);
    }
    
    public function __unset(string $name): void {
        unset($this->data[$name]);
    }
}

$obj = new DynamicObject();
$obj->name = "Test";
echo isset($obj->name) ? "exists" : "missing";

Output:

exists

Method ini umum digunakan untuk membuat wadah data yang fleksibel, menerapkan pemuatan malas, atau membangun object yang berperilaku seperti array sambil mempertahankan struktur berorientasi object.

challenge icon

Tantangan

Mudah

Mari buat pengelola konfigurasi fleksibel yang menyimpan pengaturan secara dinamis menggunakan magic method. Class-mu akan mencegat akses property untuk mengelola nilai konfigurasi, memeriksa apakah pengaturan ada, dan menghapusnya saat diperlukan, tanpa mendefinisikan setiap property secara eksplisit.

Kamu akan menyusun kodemu dalam dua file:

  • Config.php: Buat class Config yang menggunakan array privat untuk menyimpan nilai konfigurasi secara internal. Implementasikan keempat magic method property berikut:
    • __get($name): Mengembalikan nilai untuk kunci yang diberikan, atau "undefined" jika kunci tersebut tidak ada
    • __set($name, $value): Menyimpan nilai dengan kunci yang diberikan
    • __isset($name): Mengembalikan apakah kunci tersebut ada dalam konfigurasi
    • __unset($name): Menghapus kunci dari konfigurasi
    Tambahkan juga method count() yang mengembalikan jumlah pengaturan yang tersimpan.
  • main.php: Sertakan file Config. Kamu akan menerima tiga input: nama pengaturan, nilai pengaturan, dan nama pengaturan kedua. Buat instance Config dan lakukan operasi berikut:
    • Tetapkan nilai yang diberikan ke pengaturan pertama
    • Cetak apakah pengaturan pertama ada menggunakan isset(): keluarkan "exists" atau "missing"
    • Cetak nilai pengaturan pertama
    • Cetak jumlah pengaturan saat ini
    • Gunakan unset() untuk menghapus pengaturan pertama
    • Cetak apakah pengaturan pertama masih ada: keluarkan "exists" atau "missing"
    • Cetak nilai pengaturan kedua, yang belum pernah ditetapkan

Setiap output harus berada di baris tersendiri. Magic method memungkinkanmu berinteraksi dengan object Config menggunakan sintaks property yang alami seperti $config->theme = "dark" dan isset($config->theme), meskipun tidak ada property yang benar-benar didefinisikan.

Coba sendiri

<?php

require_once 'Config.php';

// Baca input
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));

// TODO: Buat instance Config

// TODO: Atur pengaturan pertama ke nilai yang diberikan

// TODO: Cetak apakah pengaturan pertama ada ("exists" atau "missing")

// TODO: Cetak nilai pengaturan pertama

// TODO: Cetak jumlah pengaturan saat ini

// TODO: Gunakan unset() untuk menghapus pengaturan pertama

// TODO: Cetak apakah pengaturan pertama masih ada ("exists" atau "missing")

// TODO: Cetak nilai pengaturan kedua (yang tidak pernah diatur)

?>
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