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

exists

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

challenge icon

Görev

Kolay

Sihirli 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 bir Config sı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
    Ayrıca saklanan ayarların sayısını döndüren bir 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ı. 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 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): boolisset() veya empty() tarafından tetiklenir
  • __unset(string $name): voidunset() 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)

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