Menu
Coddy logo textTech

__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ı:

exists

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

challenge icon

Görev

Kolay

Sihirli 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 bir Config sı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
    Ayrıca depolanan ayarların sayısını döndüren bir 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ı. Bir Config ö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)

?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi