Menu
CoddyTech

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 chwili 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 idealnie nadają się one do przechowywania wartości, które powinny pozostać niezmienne przez cały okres istnienia obiektu, takich jak identyfikatory lub znaczniki czasu utworzenia.

Właściwości tylko do odczytu muszą mieć deklarację typu i można przypisać do nich wartość tylko raz, z poziomu klasy, w której zostały zadeklarowane (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 dostępu:

<?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. Idealnie nadają się do przechowywania danych, które identyfikują obiekt lub nie powinny się zmieniać po jego utworzeniu, łącząc elastyczność inicjalizacji w czasie wykonywania z bezpieczeństwem, jakie daje zapobieganie przypadkowym modyfikacjom.

challenge icon

Wyzwanie

Łatwy

Zbudujmy niezmienny system konfiguracji, który wykorzystuje właściwości readonly, aby mieć pewność, że kluczowe 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 konstruktora, 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, odczytując je bezpośrednio: nazwę aplikacji, wersję i maksymalną liczbę połączeń.

Właściwości readonly zapewniają, że po utworzeniu konfiguracji jej wartości pozostają niezmienne — idealnie sprawdzają się w przypadku ustawień, które powinny pozostać stałe przez cały czas działania aplikacji. Zwróć uwagę, jak promocja konstruktora w połączeniu z readonly pozwala bardzo zwięźle definiować niezmienne obiekty wartości.

Wynik powinien zawierać sformatowany ciąg informacyjny, a po nim 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