__get, __set, __isset, __unset
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 46 / 91.
PHP, özellik erişimini yakalayan dört sihirli yöntem sunar: __get(), __set(), __isset() ve __unset(). Bunlar, mevcut olmayan veya erişilemeyen özelliklere erişmeye çalıştığınızda tetiklenir.
__get() methodu, erişilemeyen bir özelliği okurken çağrılır; __set() ise bir özelliğe yazma işlemini yönetir. Bu, dinamik özellikler oluşturmanıza veya özelliklere erişildiğinde mantık eklemenize olanak tanır:
<?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;
Çıktı:
Hello - 42__isset() yöntemi isset() veya empty() tarafından tetiklenir ve __unset(), unset() işlevine yanıt verir:
<?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";
Çıktı:
existsBu yöntemler esnek veri kapsayıcıları oluşturmak, tembel yüklemeyi uygulamak veya nesne yönelimli yapıyı korurken diziler gibi davranan nesneler oluşturmak için yaygın olarak kullanılır.
Görev
KolaySihirli yöntemleri kullanarak ayarları dinamik biçimde depolayan esnek bir yapılandırma yöneticisi oluşturalım. Sınıfınız, her bir özelliği açıkça tanımlamaya gerek kalmadan yapılandırma değerlerini yönetmek, ayarların mevcut olup olmadığını kontrol etmek ve gerektiğinde kaldırmak için özellik erişimini yakalayacak:
Kodunuzu iki dosyaya ayıracaksınız:
Config.php: Yapılandırma değerlerini dahili olarak depolamak için özel bir dizi kullanan birConfigsınıfı oluşturun. Dört özellik sihirli yönteminin tümünü uygulayın:__get($name): Verilen anahtarın değerini döndürür; anahtar mevcut değilse"undefined"döndürür__set($name, $value): Değeri verilen anahtarın altında depolar__isset($name): Anahtarın yapılandırmada mevcut olup olmadığını döndürür__unset($name): Anahtarı yapılandırmadan kaldırır
count()yöntemi ekleyin.main.php: Config dosyasını dahil edin. Üç girdi alacaksınız: bir ayar adı, bir ayar değeri ve ikinci bir ayar adı. BirConfigörneği oluşturun ve şu işlemleri gerçekleştirin:- İlk ayarı verilen değere ayarlayın
isset()kullanarak ilk ayarın mevcut olup olmadığını yazdırın:"exists"veya"missing"çıktısını verin- İlk ayarın değerini yazdırın
- Ayarların mevcut sayısını yazdırın
- İlk ayarı kaldırmak için
unset()kullanın - İlk ayarın artık mevcut olup olmadığını yazdırın:
"exists"veya"missing"çıktısını verin - İkinci ayarın değerini yazdırın (bu ayar hiç ayarlanmadı)
Her çıktı kendi satırında olmalıdır. Sihirli yöntemler, gerçekte hiçbir özellik tanımlanmamış olsa bile $config->theme = "dark" ve isset($config->theme) gibi doğal özellik sözdizimini kullanarak Config nesnenizle etkileşim kurmanızı sağlar.
Kendin dene
<?php
require_once 'Config.php';
// Girdileri oku
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));
// TODO: Bir Config örneği oluştur
// TODO: İlk ayarı verilen değere ayarla
// TODO: İlk ayarın var olup olmadığını yazdır ("exists" veya "missing")
// TODO: İlk ayarın değerini yazdır
// TODO: Ayarların mevcut sayısını yazdır
// TODO: İlk ayarı kaldırmak için unset() kullan
// TODO: İlk ayarın şimdi var olup olmadığını yazdır ("exists" veya "missing")
// TODO: İkinci ayarın değerini yazdır (hiç ayarlanmamış olan)
?>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