Gettery i settery
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 40 z 91.
Skoro rozumiesz modyfikatory dostępu, jak bezpiecznie korzystać z prywatnych właściwości spoza klasy? Odpowiedzią są gettery i settery — publiczne metody zapewniające kontrolowany dostęp do prywatnych danych.
Getter pobiera wartość właściwości, a setter ją modyfikuje. Ten wzorzec pozwala dodać walidację lub logikę podczas odczytywania lub zmieniania danych:
<?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();
Wynik:
john@example.com
25Setter weryfikuje format adresu e-mail i sprawdza, czy wiek jest rozsądny, zanim zapisze wartości. Bez setterów każdy mógłby bezpośrednio przypisać nieprawidłowe dane. Możesz też utworzyć właściwości tylko do odczytu, udostępniając wyłącznie getter, albo właściwości tylko do zapisu, udostępniając wyłącznie setter.
Najważniejsze: Gettery i settery pozwalają kontrolować sposób dostępu do danych prywatnych i ich modyfikowania, umożliwiając walidację, formatowanie lub zastosowanie dowolnej niestandardowej logiki.
Wyzwanie
ŁatwyZbudujmy system ewidencji produktów, który używa metod pobierających i ustawiających, aby chronić i weryfikować dane produktów. Utworzysz klasę Product, która gwarantuje, że ceny są zawsze dodatnie, a ilości w magazynie nigdy nie są ujemne: pokażemy, jak metody ustawiające mogą egzekwować reguły biznesowe.
Rozmieścisz swój kod w dwóch plikach:
Product.php: Utwórz klasęProductz trzema prywatnymi właściwościami:$name(ciąg znaków),$price(liczba zmiennoprzecinkowa) i$stock(liczba całkowita). Zaimplementuj metody pobierające i ustawiające dla każdej właściwości, stosując następujące reguły weryfikacji:setName()powinna akceptować tylko niepuste ciągi znaków; jeśli ciąg jest pusty po usunięciu białych znaków z początku i końca, nie aktualizuj właściwościsetPrice()powinna akceptować tylko wartości większe niż 0: odrzucaj ceny równe zero lub ujemnesetStock()powinna akceptować tylko wartości równe 0 lub większe: odrzucaj ujemne ilości w magazynie
getInfo(), która zwraca"[name]: $[price] ([stock] in stock)", a cena jest sformatowana do 2 miejsc po przecinku.main.php: Dołącz plik Product. Otrzymasz cztery dane wejściowe: nazwę produktu, cenę, ilość w magazynie oraz nową cenę do aktualizacji. Utwórz instancję klasyProducti użyj metod ustawiających, aby przypisać początkową nazwę, cenę (przekonwertowaną na liczbę zmiennoprzecinkową) i ilość w magazynie (przekonwertowaną na liczbę całkowitą). Wypisz wynikgetInfo(). Następnie spróbuj zaktualizować cenę, używając nowej wartości ceny (przekonwertowanej na liczbę zmiennoprzecinkową), i ponownie wypiszgetInfo(). Na koniec spróbuj ustawić ilość w magazynie na-5(nieprawidłowa wartość) i jeszcze raz wypiszgetInfo(), aby potwierdzić, że ilość w magazynie się nie zmieniła.
Twoje metody ustawiające pełnią funkcję strażników. Weryfikują przychodzące dane, zanim pozwolą na zmianę prywatnych właściwości. Gdy przekazane zostaną nieprawidłowe dane (na przykład ujemna ilość w magazynie), metoda ustawiająca po prostu je ignoruje, zachowując dotychczasową prawidłową wartość. Na tym polega siła enkapsulacji: Twój obiekt zachowuje spójność niezależnie od tego, co próbuje zrobić zewnętrzny kod.
Spróbuj swoich sił
<?php
require_once 'Product.php';
// Odczytaj dane wejściowe
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));
// TODO: Utwórz nową instancję Product
// TODO: Użyj setterów, aby przypisać początkową nazwę, cenę (jako float) i stan magazynowy (jako integer)
// TODO: Wyświetl wynik getInfo()
// TODO: Zaktualizuj cenę, używając newPrice (jako float), i ponownie wyświetl wynik getInfo()
// TODO: Spróbuj ustawić stan magazynowy na -5 (wartość nieprawidłowa) i wyświetl wynik getInfo(), aby potwierdzić, że stan magazynowy się nie zmienił
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online