Właściwości tylko do odczytu (PHP 8.1)
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 19 z 91.
PHP 8.1 wprowadził właściwości readonly, którym można przypisać wartość tylko raz i których nie można później modyfikować. W przeciwieństwie do stałych właściwości readonly są ustawiane podczas inicjalizacji obiektu, a nie w momencie definiowania klasy.
Deklarujesz właściwość tylko do odczytu, dodając słowo kluczowe readonly przed deklaracją typu:
<?php
class User {
public readonly string $id;
public readonly string $name;
public function __construct(string $id, string $name) {
$this->id = $id;
$this->name = $name;
}
}
$user = new User("U001", "Alice");
echo $user->id . "\n";
echo $user->name;
Wynik:
U001
AlicePo przypisaniu próba zmiany właściwości tylko do odczytu spowoduje błąd. Dzięki temu świetnie nadają się one do wartości, które powinny pozostać niezmienne przez cały okres życia obiektu, takich jak identyfikatory lub znaczniki czasu utworzenia.
Właściwości tylko do odczytu muszą mieć deklarację typu i można im przypisać wartość tylko raz, z poziomu klasy, która je deklaruje (zazwyczaj w konstruktorze). W przeciwieństwie do zwykłych właściwości nie można im przypisać wartości domyślnej podczas deklaracji. Działają z każdym modyfikatorem widoczności:
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
public function getCost(): float {
return $this->cost;
}
}
$product = new Product("ABC123", 29.99);
echo $product->sku;
Wynik:
ABC123Najważniejsza kwestia: Właściwości tylko do odczytu zapewniają niezmienność na poziomie właściwości. Są idealne dla danych, które identyfikują obiekt lub nie powinny się zmieniać po jego utworzeniu, łącząc elastyczność inicjalizacji w czasie wykonywania z bezpieczeństwem wynikającym z zapobiegania przypadkowym modyfikacjom.
Wyzwanie
ŁatwyZbudujmy niezmienny system konfiguracji, który wykorzystuje właściwości readonly, aby mieć pewność, że krytyczne ustawienia nie zostaną przypadkowo zmienione po inicjalizacji.
Utworzysz dwa pliki, które współpracują ze sobą, aby zarządzać konfiguracją aplikacji:
Config.php: Zdefiniuj klasęConfig, która reprezentuje konfigurację aplikacji z niezmiennymi ustawieniami. Klasa powinna mieć trzy publiczne właściwości readonly:string $appName,string $versioniint $maxConnections. Użyj promocji właściwości w konstruktorze, aby zadeklarować i zainicjalizować wszystkie trzy właściwości readonly w jednej, przejrzystej definicji konstruktora. Dodaj metodęgetInfo(), która zwraca ciąg znaków w formacie"[appName] v[version] (max: [maxConnections] connections)".main.php: Dołącz plik klasy Config. Otrzymasz trzy dane wejściowe: nazwę aplikacji, wersję i maksymalną liczbę połączeń (jako ciąg znaków, który trzeba przekonwertować na liczbę całkowitą). Utwórz obiektConfigprzy użyciu tych wartości. Wypisz wynikgetInfo()w pierwszym wierszu. Następnie wypisz każdą właściwość readonly w osobnym wierszu, uzyskując do nich bezpośredni dostęp: nazwę aplikacji, wersję i maksymalną liczbę połączeń.
Właściwości readonly gwarantują, że po utworzeniu konfiguracji jej wartości pozostaną niezmienione — to idealne rozwiązanie dla ustawień, które powinny pozostać stałe przez cały czas działania aplikacji. Zwróć uwagę, jak promocja właściwości w konstruktorze w połączeniu z readonly pozwala bardzo zwięźle definiować niezmienne obiekty wartości.
Wynik powinien wyświetlać sformatowany ciąg informacji, a następnie wartość każdej właściwości z osobna, pokazując, że właściwości readonly nadal można odczytywać spoza klasy.
Spróbuj swoich sił
<?php
require_once 'Config.php';
// Wczytaj dane wejściowe
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));
// TODO: Utwórz obiekt Config, używając wartości wejściowych
// TODO: Wypisz wynik getInfo()
// TODO: Wypisz każdą właściwość readonly w osobnym wierszu:
// - nazwa aplikacji
// - wersja
// - maksymalna liczba połączeń
?>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