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
25Setter, 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.
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 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 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ü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()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. 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 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 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 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
?>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