Код IT
← Каталог

Важные встроенные классы и интерфейсы — Трейты — горизонтальное повторное использование кода

Фрагмент из «Важные встроенные классы и интерфейсы»: Трейты — горизонтальное повторное использование кода.

PHP main.php
<?php
// Определение трейта с методом логирования
trait Loggable {
    public function log(string $message): void {
        echo "[LOG] {$message}\n";
    }
}

// Определение другого трейта с таким же именем метода
trait Timestampable {
    public function log(string $message): void {
        echo "[TIMESTAMP] {$message} at " . date('Y-m-d H:i:s') . "\n";
    }
}

// Класс, использующий оба трейта
class OrderService {
    use Loggable, Timestampable {
        // Разрешаем конфликт: метод из Timestampable имеет приоритет
        Timestampable::log insteadof Loggable;
        // Или можно создать алиас для оригинального метода Loggable
        // Loggable::log as logClassic;
    }

    public function createOrder(): void {
        // Вызовется метод из Timestampable
        $this->log("Создание заказа...");
    }
}

$service = new OrderService();
$service->createOrder();
// Вывод: [TIMESTAMP] Создание заказа... at ...
<?php
// Определение трейта с методом логирования
trait Loggable {
    public function log(string $message): void {
        echo "[LOG] {$message}\n";
    }
}

// Определение другого трейта с таким же именем метода
trait Timestampable {
    public function log(string $message): void {
        echo "[TIMESTAMP] {$message} at " . date('Y-m-d H:i:s') . "\n";
    }
}

// Класс, использующий оба трейта
class OrderService {
    use Loggable, Timestampable {
        // Разрешаем конфликт: метод из Timestampable имеет приоритет
        Timestampable::log insteadof Loggable;
        // Или можно создать алиас для оригинального метода Loggable
        // Loggable::log as logClassic;
    }

    public function createOrder(): void {
        // Вызовется метод из Timestampable
        $this->log("Создание заказа...");
    }
}

$service = new OrderService();
$service->createOrder();
// Вывод: [TIMESTAMP] Создание заказа... at ...