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
25Setter, 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.
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 birProductsı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üncellemeyinsetPrice()yalnızca 0'dan büyük değerleri kabul etmelidir — sıfır veya negatif fiyatları reddedinsetStock()yalnızca 0 veya daha büyük değerleri kabul etmelidir — negatif stok miktarlarını reddedin
"[name]: $[price] ([stock] in stock)"döndüren bir publicgetInfo()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. BirProductö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 vegetInfo()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çingetInfo()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
?>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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar KelimesiMetotlarÖzelliklerYapıcı Metot (__construct)Yıkıcı Metot (__destruct)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar KelimesiMetot Geçersiz Kılmafinal Anahtar KelimesiSoyut SınıflarÖzet - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicilere Derinlemesine BakışGetter ve Setter MetotlarıBilgi GizlemeConstructor Promotion (8.0)Özet - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımDependency InjectionAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlama: Derinlemesine İncelemeGenerator'lar ve Iterator'lar13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı2İsim Alanları ve Autoloading
İsim Alanlarına Girişuse Anahtar KelimesiPSR-4 Autoloading StandartıComposer AutoloaderÖzet - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Fazla Arayüz UygulamaArayüz vs Soyut SınıfArayüzler ile Tip BelirlemeÖzet - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Nesne Klonlama__serialize & __unserializeÖzet - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerReadonly Özellikler (PHP 8.1)Özet - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmaya Yeniden BakışArayüzler ile Çok BiçimlilikType Hinting ve Union TypesLate Static BindingÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişÇoklu Trait KullanımıTrait Çakışma ÇözümüTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım12Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı15Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi