Traits with interfaces

In PHP, Traits can't implement interfaces. They can, however, include abstract methods. These methods then need to be implemented by the concrete class that implements the trait. This allows a trait to provide some boilerplate implementation that depends on an concrete implementation. This isn't always a good idea (it's verging on violating the Dependency Inversion Principle but it's better than a trait attempting to use a method that has no contract.

Example:

<?php
trait LoggerTrait
{
    abstract public function log($level, $message, array $context = array());
    
    public function error($message, array $context = array())
    {
        $this->log(LogLevel::ERROR, $message, $context);
    } 
}