Promocja parametrów konstruktora (8.0)
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 42 z 91.
PHP 8.0 wprowadził promocję konstruktora, funkcję, która znacznie ogranicza ilość powtarzalnego kodu podczas definiowania klas. Zamiast osobno deklarować właściwości, a następnie przypisywać im wartości w konstruktorze, możesz zrobić to za jednym razem.
Oto tradycyjne podejście, którego używasz:
<?php
class Product {
private string $name;
private float $price;
public function __construct(string $name, float $price) {
$this->name = $name;
$this->price = $price;
}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
Dzięki promowaniu konstruktora dodajesz modyfikator dostępu bezpośrednio do parametrów konstruktora:
<?php
class Product {
public function __construct(
private string $name,
private float $price
) {}
public function getInfo(): string {
return $this->name . ": $" . $this->price;
}
}
$product = new Product("Laptop", 999.99);
echo $product->getInfo();
Wynik:
Laptop: $999.99Dodając private, protected lub public przed parametrem konstruktora, PHP automatycznie tworzy właściwość i przypisuje jej wartość. Możesz łączyć parametry promowane ze zwykłymi parametrami w tym samym konstruktorze i w razie potrzeby nadal dodawać logikę w ciele konstruktora.
Najważniejsze: Promocja konstruktora eliminuje powtarzające się deklaracje i przypisania właściwości, dzięki czemu klasy są bardziej przejrzyste i łatwiejsze do odczytania, a jednocześnie zachowujesz pełną kontrolę nad hermetyzacją.
Wyzwanie
ŁatwyStwórzmy system zarządzania kontaktami, który pokazuje elegancję promocji konstruktora. Utworzysz przejrzystą, nowoczesną klasę PHP, która eliminuje powtarzalny kod, zachowując właściwą enkapsulację.
Rozmieścisz kod w dwóch plikach:
Contact.php: Utwórz klasęContact, używając promocji konstruktora do zdefiniowania wszystkich właściwości bezpośrednio w sygnaturze konstruktora. Twój kontakt powinien mieć:- Prywatną właściwość
$name(string) - Prywatną właściwość
$email(string) - Prywatną właściwość
$phone(string) z wartością domyślną"Not provided"
getFullDetails(), która zwraca"[name] | [email] | [phone]". Dodaj też metodęgetSummary(), która zwraca"Contact: [name]".- Prywatną właściwość
main.php: Dołącz plik Contact. Otrzymasz trzy dane wejściowe: imię, adres e-mail i numer telefonu. Utwórz dwie instancjeContact:- Pierwszy kontakt powinien używać wszystkich trzech wartości (imienia, adresu e-mail i numeru telefonu)
- Drugi kontakt powinien używać tylko imienia i adresu e-mail (korzystając z domyślnej wartości telefonu)
- Pełne informacje o pierwszym kontakcie
- Podsumowanie pierwszego kontaktu
- Pełne informacje o drugim kontakcie
- Podsumowanie drugiego kontaktu
Zauważ, że promocja konstruktora pozwala definiować właściwości, ustawiać ich widoczność, deklarować ich typy i przypisywać im wartości — wszystko w jednej, czytelnej sygnaturze konstruktora. Opcjonalny parametr telefonu z wartością domyślną pokazuje, że promowane parametry bezproblemowo współpracują z wartościami domyślnymi, tak jak zwykłe parametry.
Spróbuj swoich sił
<?php
require_once 'Contact.php';
// Odczytaj dane wejściowe
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));
// TODO: Utwórz pierwszy kontakt ze wszystkimi trzema wartościami (name, email, phone)
// TODO: Utwórz drugi kontakt, podając tylko name i email (użyj domyślnej wartości phone)
// TODO: Wyświetl pełne dane pierwszego kontaktu
// TODO: Wyświetl podsumowanie pierwszego kontaktu
// TODO: Wyświetl pełne dane drugiego kontaktu
// TODO: Wyświetl podsumowanie drugiego kontaktu
?>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