Menu
Coddy logo textTech

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
25

Setter 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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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ę Product z 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ści
    • setPrice() powinna akceptować tylko wartości większe niż 0: odrzucaj ceny równe zero lub ujemne
    • setStock() powinna akceptować tylko wartości równe 0 lub większe: odrzucaj ujemne ilości w magazynie
    Każda metoda pobierająca powinna po prostu zwracać odpowiadającą jej wartość właściwości. Dodaj publiczną metodę 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ę klasy Product i 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 wynik getInfo(). Następnie spróbuj zaktualizować cenę, używając nowej wartości ceny (przekonwertowanej na liczbę zmiennoprzecinkową), i ponownie wypisz getInfo(). Na koniec spróbuj ustawić ilość w magazynie na -5 (nieprawidłowa wartość) i jeszcze raz wypisz getInfo(), 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ł

?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online