Menu
Coddy logo textTech

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
Alice

Po 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:

ABC123

Najważ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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 $version i int $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 obiekt Config przy użyciu tych wartości. Wypisz wynik getInfo() 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ń

?>
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