__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, var olmayan veya erişilemeyen özelliklere erişmeye çalıştığınızda tetiklenir.
__get() yöntemi, erişilemeyen bir özellik okunduğunda çağrılırken, __set() yöntemi 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() metodu isset() veya empty() tarafından tetiklenir ve __unset(), unset() fonksiyonuna 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 yaygın olarak esnek veri kapsayıcıları oluşturmak, lazy loading uygulamak veya nesne yönelimli yapıyı korurken diziler gibi davranan nesneler inşa etmek için kullanılır.
Görev
KolaySihirli metotları kullanarak ayarları dinamik olarak saklayan esnek bir yapılandırma yöneticisi (configuration manager) oluşturalım. Sınıfınız, yapılandırma değerlerini yönetmek, ayarların var olup olmadığını kontrol etmek ve gerektiğinde bunları kaldırmak için özellik erişimini kesecektir — üstelik her bir özelliği açıkça tanımlamanıza gerek kalmadan.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Config.php— Yapılandırma değerlerini dahili olarak saklamak için özel (private) bir dizi kullanan birConfigsınıfı oluşturun. Dört özellik sihirli metodunun tümünü uygulayın:__get($name)— Verilen anahtar için değeri döndürür, anahtar mevcut değilse"undefined"döndürür__set($name, $value)— Değeri verilen anahtar altında saklar__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()metodu 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 var olup olmadığını yazdırın — çıktı"exists"veya"missing"olmalıdır- İlk ayarın değerini yazdırın
- Mevcut ayar sayısını yazdırın
- İlk ayarı kaldırmak için
unset()kullanın - İlk ayarın şimdi var olup olmadığını yazdırın — çıktı
"exists"veya"missing"olmalıdır - İkinci ayarın değerini yazdırın (hiç ayarlanmamış olan)
Her çıktı kendi satırında olmalıdır. Sihirli metotlar, gerçek özellikler tanımlanmamış olsa bile, $config->theme = "dark" ve isset($config->theme) gibi doğal özellik sözdizimini kullanarak Config nesnenizle etkileşim kurmanıza olanak tanır.
Kopya kağıdı
PHP, özellik erişimini kesmek için dört sihirli yöntem sunar:
__get(string $name): mixed— Erişilemeyen bir özellik okunduğunda çağrılır__set(string $name, mixed $value): void— Erişilemeyen bir özelliğe yazıldığında çağrılır__isset(string $name): bool—isset()veyaempty()tarafından tetiklenir__unset(string $name): void—unset()tarafından tetiklenir
__get() ve __set() örneği:
<?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";
echo $obj->title; // Hello
__isset() ve __unset() örneği:
<?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"; // exists
Bu yöntemler, nesne yönelimli yapıyı korurken dinamik özellikler, geç yükleme (lazy loading) ve esnek veri kapsayıcıları 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şturun
// TODO: İlk ayarı verilen değere atayın
// TODO: İlk ayarın var olup olmadığını yazdırın ("exists" veya "missing")
// TODO: İlk ayarın değerini yazdırın
// TODO: Mevcut ayar sayısını yazdırın
// TODO: İlk ayarı kaldırmak için unset() kullanın
// TODO: İlk ayarın şu an var olup olmadığını yazdırın ("exists" veya "missing")
// TODO: İkinci ayarın değerini yazdırın (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 KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarı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ıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi