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 belirleyicilerini anladığınıza göre, sınıf dışından private özelliklerle nasıl güvenli bir şekilde etkileşime girersiniz? Cevap, getter ve setter'lardır; yani özel verilere kontrollü erişim sağlayan public metotlar.

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, herkes doğrudan geçersiz veri 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.

Önemli 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 yürütmenize olanak tanır.

challenge icon

Görev

Kolay

Ürün verilerini korumak ve doğrulamak için getter ve setter yöntemlerini 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 yöntemlerinin 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 yöntemlerini 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 yöntemi 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() yöntemi 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 yöntemlerini 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 yöntemleriniz 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.

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ıçtaki name, price (float olarak) ve stock (integer olarak) değerlerini atamak için setter metodlarını kullanın

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

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

// TODO: stock değerini -5 (geçersiz) yapmayı deneyin ve stok miktarının değişmediğini doğrulamak 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