Что такое трейт в PHP?

«Что такое трейт в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Трейт (trait) в PHP — это механизм для горизонтального повторного использования кода, введенный в PHP 5.4. Он позволяет включать наборы методов в классы без использования классического наследования, решая проблему множественного наследования и уменьшая дублирование кода.

Ключевые особенности:

  • Трейт не может быть инстанциирован самостоятельно.
  • Методы трейта компилируются непосредственно в использующий его класс в момент use.
  • Поддерживает абстрактные методы, статические методы и свойства.
  • Разрешение конфликтов имен: если два трейта содержат методы с одинаковыми именами, необходимо явно указать, какой использовать, с помощью операторов insteadof и as.
  • Трейты могут быть вложенными (трейт может использовать другие трейты).

Пример использования:

trait Loggable {
    public function log(string $message): void {
        echo '[' . date('Y-m-d H:i:s') . '] ' . $message . PHP_EOL;
    }
}

trait Cacheable {
    private array $cache = [];
    public function getCached(string $key) {
        return $this->cache[$key] ?? null;
    }
}

class UserService {
    use Loggable, Cacheable;

    public function createUser(array $data): void {
        // Бизнес-логика
        $this->log('User created with data: ' . json_encode($data));
    }
}

$service = new UserService();
$service->createUser(['name' => 'John']);
// Вывод: [2023-10-26 14:30:00] User created with data: {"name":"John"}