__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 - 42method __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:
existsMethod ini umum digunakan untuk membuat wadah data yang fleksibel, menerapkan pemuatan malas, atau membangun object yang berperilaku seperti array sambil mempertahankan struktur berorientasi object.
Tantangan
MudahMari 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 classConfigyang 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
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 instanceConfigdan 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)
?>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