Korzystanie z wielu cech
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 52 z 91.
Pojedyncza cecha jest przydatna, ale prawdziwa moc tkwi w łączeniu wielu cech w jednej klasie. PHP pozwala dołączać tyle cech, ile potrzebujesz, dzięki czemu Twoja klasa może jednocześnie korzystać z możliwości pochodzących z kilku źródeł.
Aby użyć wielu cech, po prostu wymień je po przecinkach po słowie kluczowym use:
<?php
trait Timestampable {
public function getTimestamp(): string {
return date('Y-m-d H:i:s');
}
}
trait Identifiable {
private string $id;
public function generateId(): void {
$this->id = uniqid('id_');
}
public function getId(): string {
return $this->id;
}
}
class Post {
use Timestampable, Identifiable;
public function __construct(public string $title) {
$this->generateId();
}
}
$post = new Post("Hello World");
echo $post->getId() . " - " . $post->getTimestamp();
Wynik:
id_6789abc123 - 2024-01-15 10:30:00Klasa Post ma teraz metody z obu cech. Każda cecha wnosi własną funkcjonalność — Timestampable udostępnia metody związane z czasem, a Identifiable odpowiada za unikalne identyfikatory. Takie podejście sprawia, że każda cecha skupia się na jednym zadaniu, dzięki czemu Twój kod jest bardziej modularny i nadaje się do ponownego użycia.
Co się dzieje, gdy dwie cechy mają metody o tej samej nazwie? To sytuacja konfliktowa, którą omówimy w następnej lekcji.
Wyzwanie
ŁatwyZbudujmy system zarządzania produktami, który łączy wiele cech, aby zapewnić produktom zarówno obsługę cen, jak i zapasów. Każda cecha będzie odpowiadać za jedno zadanie, a Twoja klasa produktu zyska funkcjonalność obu.
Podzielisz kod na trzy pliki:
Priceable.php: Utwórz cechę o nazwiePriceable, która obsługuje funkcjonalność związaną z cenami. Cecha powinna zawierać:- Prywatną właściwość
$price(float) - Metodę
setPrice(float $price), która zapisuje cenę - Metodę
getPrice(), która zwraca cenę - Metodę
getFormattedPrice(), która zwraca cenę sformatowaną jako"$[price]"z 2 miejscami po przecinku
- Prywatną właściwość
Stockable.php: Utwórz cechę o nazwieStockable, która zarządza zapasami. Cecha powinna zawierać:- Prywatną właściwość
$stock(integer) - Metodę
setStock(int $quantity), która zapisuje ilość produktu w zapasie - Metodę
getStock(), która zwraca aktualny stan zapasów - Metodę
isInStock(), która zwracatrue, jeśli stan zapasów jest większy niż 0, a w przeciwnym raziefalse
- Prywatną właściwość
main.php: Dołącz oba pliki z cechami i utwórz klasęProduct, która używa obu cech:PriceableiStockable. Użyj promocji właściwości konstruktora, aby zdefiniować publiczną właściwość$name. Konstruktor powinien również przyjmować cenę i ilość produktu w zapasie oraz używać metod cech, aby je ustawić.Otrzymasz trzy dane wejściowe: nazwę produktu, cenę i ilość produktu w zapasie. Utwórz produkt z tymi wartościami i wypisz cztery wiersze:
- Nazwę produktu
- Sformatowaną cenę (używając
getFormattedPrice()) - Ilość produktu w zapasie
"Available", jeśli produkt jest w zapasie, lub"Out of stock", jeśli go nie ma
To pokazuje, jak współdziałają ze sobą różne cechy. Twoja klasa Product zyskuje funkcje obsługi cen z jednej cechy, a zarządzanie zapasami z drugiej, dzięki czemu poszczególne zadania są dobrze rozdzielone, a jednocześnie połączone w pełni funkcjonalny produkt.
Spróbuj swoich sił
<?php
require_once 'Priceable.php';
require_once 'Stockable.php';
// TODO: Utwórz klasę Product, która używa obu traitów Priceable i Stockable
// Użyj promocji parametrów konstruktora dla publicznej właściwości $name
// Konstruktor powinien przyjmować name, price i stock oraz używać metod traitów do ustawiania price i stock
class Product {
// TODO: Użyj tutaj traitów
// TODO: Zaimplementuj konstruktor z promocją parametrów dla $name
// i ustaw price oraz stock za pomocą metod traitów
}
// Odczytaj dane wejściowe
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$stock = intval(trim(fgets(STDIN)));
// TODO: Utwórz instancję Product z wartościami wejściowymi
// TODO: Wypisz nazwę produktu
// TODO: Wypisz sformatowaną cenę za pomocą getFormattedPrice()
// TODO: Wypisz ilość w magazynie
// TODO: Wypisz "Available", jeśli produkt jest dostępny w magazynie, lub "Out of stock" w przeciwnym razie
?>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