Menu
Coddy logo textTech

Getter ve Setter'lar

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

Artık erişim belirleyicilerini anladığınıza göre, sınıfın dışından özel özelliklerle nasıl güvenli bir şekilde etkileşim kurabilirsiniz? Cevap getter'lar ve setter'lardır - özel verilere kontrollü erişim sağlayan public metotlar.

Bir getter bir özelliğin değerini alırken, bir setter bu değeri değiştirir. Bu desen, verilere erişildiğinde veya veriler değiştirildiğinde doğrulama ya da 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 depolamadan önce e-posta biçimini doğrular ve yaşın makul olduğundan emin olur. Setter’lar olmadan herkes geçersiz verileri doğrudan atayabilir. Ayrıca yalnızca bir getter sağlayarak salt okunur özellikler veya yalnızca bir setter ile salt yazılır özellikler oluşturabilirsiniz.

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

challenge icon

Görev

Kolay

Getter ve setter'ları kullanarak ürün verilerini koruyan ve doğrulayan bir ürün envanter sistemi oluşturalım. Fiyatların her zaman pozitif ve stok miktarlarının hiçbir zaman negatif olmamasını sağlayan bir Product sınıfı oluşturacaksın: böylece setter'ların iş kurallarını nasıl uygulayabildiğini göstereceksin.

Kodunu iki dosyada düzenleyeceksin:

  • Product.php: Üç özel özelliğe sahip bir Product sınıfı oluştur: $name (string), $price (float) ve $stock (integer). Her özellik için aşağıdaki doğrulama kurallarını uygulayan getter ve setter'lar oluştur:
    • setName() yalnızca boş olmayan dizeleri kabul etmeli; dize kırpıldıktan sonra boşsa özelliği güncelleme
    • setPrice() yalnızca 0'dan büyük değerleri kabul etmeli: sıfır veya negatif fiyatları reddet
    • setStock() yalnızca 0 veya daha büyük değerleri kabul etmeli: negatif stok miktarlarını reddet
    Her getter, ilgili özellik değerini doğrudan döndürmeli. Fiyatı 2 ondalık basamağa biçimlendirilmiş şekilde "[name]: $[price] ([stock] in stock)" döndüren bir getInfo() genel metodu ekle.
  • main.php: Product dosyasını dahil et. Dört girdi alacaksın: bir ürün adı, bir fiyat, bir stok miktarı ve güncelleme için yeni bir fiyat. Bir Product örneği oluştur ve başlangıç adını, fiyatını (float türüne dönüştürülmüş) ve stokunu (integer türüne dönüştürülmüş) atamak için setter'ları kullan. getInfo() sonucunu yazdır. Ardından fiyatı yeni fiyat değeriyle (float türüne dönüştürülmüş) güncellemeyi dene ve getInfo() sonucunu tekrar yazdır. Son olarak stoğu -5 değerine (geçersiz bir değer) ayarlamayı dene ve stoğun değişmediğini doğrulamak için getInfo() sonucunu bir kez daha yazdır.

Setter'ların birer bekçi gibi çalışır. Değişikliklere izin vermeden önce gelen verileri doğrularlar. Geçersiz veriler aktarıldığında (negatif stok gibi), setter bunları basitçe yok sayar ve mevcut geçerli değeri olduğu gibi korur. Kapsüllemenin gücü budur: harici kod ne yapmaya çalışırsa çalışsın nesnen bütünlüğünü korur.

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ştur

// TODO: Başlangıç name, price (float olarak) ve stock (integer olarak) atamak için setter'ları kullan

// TODO: getInfo() sonucunu yazdır

// TODO: price'ı newPrice (float olarak) ile güncelle ve getInfo()'yu tekrar yazdır

// TODO: stock'u -5 olarak ayarlamayı dene (geçersiz) ve stock'un değişmediğini doğrulamak için getInfo()'yu yazdır

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