Menu
Coddy logo textTech

Getter ve Setter Metotları

Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 40 / 91.

Erişim belirleyicileri (access modifiers) anladığınıza göre, sınıf dışından private özelliklerle nasıl güvenli bir şekilde etkileşime girersiniz? Cevap, private verilere kontrollü erişim sağlayan public metotlar olan getters ve setters'dır.

Bir getter bir özelliğin değerini alırken, bir setter onu değiştirir. Bu desen, veriye erişildiğinde veya veri değiştirildiğinde doğrulama veya mantık eklemenize olanak tanır:

<?php
class User {
    private string $email;
    private int $age;
    
    public function getEmail(): string {
        return $this->email;
    }
    
    public function setEmail(string $email): void {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $this->email = $email;
        }
    }
    
    public function getAge(): int {
        return $this->age;
    }
    
    public function setAge(int $age): void {
        if ($age >= 0 && $age <= 150) {
            $this->age = $age;
        }
    }
}

$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);

echo $user->getEmail() . "\n";
echo $user->getAge();

Çıktı:

john@example.com
25

Setter, değerleri saklamadan önce e-posta formatını doğrular ve yaşın makul olduğundan emin olur. Setter'lar olmadan, herhangi biri doğrudan geçersiz veri atayabilir. Ayrıca, yalnızca bir getter sağlayarak salt okunur özellikler veya yalnızca bir setter sağlayarak salt yazılır özellikler oluşturabilirsiniz.

Önemli Nokta: Getter ve setter'lar, özel verilere nasıl erişildiği ve bunların nasıl değiştirildiği üzerinde kontrol sağlayarak doğrulama, biçimlendirme veya herhangi bir özel mantığa olanak tanır.

challenge icon

Görev

Kolay

Ürün verilerini korumak ve doğrulamak için getter ve setter metotlarını kullanan bir ürün envanter sistemi oluşturalım. Fiyatların her zaman pozitif ve stok miktarlarının asla negatif olmamasını sağlayan bir Product sınıfı oluşturacaksınız; bu, setter metotlarının iş kurallarını nasıl uygulayabileceğini gösterecektir.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • Product.php — Üç özel (private) özelliğe sahip bir Product sınıfı oluşturun: $name (string), $price (float) ve $stock (integer). Her özellik için aşağıdaki doğrulama kurallarına sahip getter ve setter metotlarını uygulayın:
    • setName() yalnızca boş olmayan dizeleri kabul etmelidir — eğer dize kırpıldıktan (trim) sonra boşsa, özelliği güncellemeyin
    • setPrice() yalnızca 0'dan büyük değerleri kabul etmelidir — sıfır veya negatif fiyatları reddedin
    • setStock() yalnızca 0 veya daha büyük değerleri kabul etmelidir — negatif stok miktarlarını reddedin
    Her getter metodu sadece ilgili özellik değerini döndürmelidir. Fiyatı 2 ondalık basamakla formatlanmış şekilde "[name]: $[price] ([stock] in stock)" döndüren bir public getInfo() metodu ekleyin.
  • main.php — Product dosyasını dahil edin. Dört girdi alacaksınız: bir ürün adı, bir fiyat, bir stok miktarı ve güncellenecek yeni bir fiyat. Bir Product örneği oluşturun ve başlangıç adını, fiyatı (float'a dönüştürülmüş) ve stoğu (integer'a dönüştürülmüş) atamak için setter metotlarını kullanın. getInfo() sonucunu yazdırın. Ardından fiyatı yeni fiyat değeriyle (float'a dönüştürülmüş) güncellemeyi deneyin ve getInfo() sonucunu tekrar yazdırın. Son olarak, stoğu -5 (geçersiz bir değer) olarak ayarlamayı deneyin ve stoğun değişmediğini onaylamak için getInfo() sonucunu bir kez daha yazdırın.

Setter metotlarınız bekçi görevi görür — özel özelliklerde değişikliğe izin vermeden önce gelen verileri doğrularlar. Geçersiz veri gönderildiğinde (negatif stok gibi), setter bunu görmezden gelir ve mevcut geçerli değeri olduğu gibi korur. Kapsüllemenin (encapsulation) gücü budur: nesneniz, dış kodun ne yapmaya çalıştığından bağımsız olarak kendi bütünlüğünü korur.

Kopya kağıdı

Özel (private) özelliklere kontrollü erişim sağlamak için getter ve setter metotlarını kullanın. Bir getter değeri alırken, bir setter isteğe bağlı doğrulama ile değeri değiştirir:

<?php
class User {
    private string $email;
    private int $age;
    
    public function getEmail(): string {
        return $this->email;
    }
    
    public function setEmail(string $email): void {
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $this->email = $email;
        }
    }
    
    public function getAge(): int {
        return $this->age;
    }
    
    public function setAge(int $age): void {
        if ($age >= 0 && $age <= 150) {
            $this->age = $age;
        }
    }
}

$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);

echo $user->getEmail(); // john@example.com
echo $user->getAge(); // 25

Setter metotları, veriyi saklamadan önce doğrulayabilir. Doğrulama başarısız olursa, setter güncellemeyi görmezden gelerek mevcut değeri olduğu gibi koruyabilir. Sadece bir getter sağlayarak salt okunur (read-only) özellikler veya sadece bir setter sağlayarak salt yazılır (write-only) özellikler oluşturabilirsiniz.

Kendin dene

<?php
require_once 'Product.php';

// Girdileri oku
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));

// TODO: Yeni bir Product örneği oluşturun

// TODO: Başlangıç adını, fiyatını (float olarak) ve stoğunu (tam sayı olarak) atamak için setter'ları kullanın

// TODO: getInfo() sonucunu yazdırın

// TODO: Fiyatı newPrice (float olarak) ile güncelleyin ve getInfo() sonucunu tekrar yazdırın

// TODO: Stoğu -5 (geçersiz) olarak ayarlamayı deneyin ve stoğun değişmediğini onaylamak için getInfo() sonucunu yazdırın

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