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
25Setter, 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.
Görev
KolayGetter 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 birProductsı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üncellemesetPrice()yalnızca 0'dan büyük değerleri kabul etmeli: sıfır veya negatif fiyatları reddetsetStock()yalnızca 0 veya daha büyük değerleri kabul etmeli: negatif stok miktarlarını reddet
"[name]: $[price] ([stock] in stock)"döndüren birgetInfo()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. BirProductö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 vegetInfo()sonucunu tekrar yazdır. Son olarak stoğu-5değerine (geçersiz bir değer) ayarlamayı dene ve stoğun değişmediğini doğrulamak içingetInfo()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
?>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 SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarı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ıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi