Menu
Coddy logo textTech

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

Klasa 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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 nazwie Priceable, 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
  • Stockable.php: Utwórz cechę o nazwie Stockable, 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 zwraca true, jeśli stan zapasów jest większy niż 0, a w przeciwnym razie false
  • main.php: Dołącz oba pliki z cechami i utwórz klasę Product, która używa obu cech: Priceable i Stockable. 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
?>
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