Пример номер один - трейт для внедрение через сеттер и геттер сервис менеджера.
... или других сервисов в другие сервисы.
use Zend\ServiceManager\ServiceLocatorInterface;
/**
* ServiceManagerAwareTrait trait.
*/
trait ServiceManagerAwareTrait
{
/**
* $serviceManager instance.
* @var ServiceLocatorInterface
*/
protected $serviceManager = null;
/**
* Set $serviceManager.
*
* @param ServiceLocatorInterface $serviceManager
* @return self
*/
public function setServiceManager(ServiceLocatorInterface $serviceManager)
{
$this->serviceManager = $serviceManager;
return $this;
}
/**
* Retrieve $serviceManager.
*
* @return ServiceLocatorInterface $serviceManager
*/
public function getServiceManager()
{
return $this->serviceManager;
}
}
Номер два - наследовать вы можете только ОДИН класс, а трейтов - МИЛЛИОН и тележку...
Вот у вас есть сервис, который вы обязаны унаследовать от некого стандартного класса...
... но желаете добавить еще несколько методов...
Что тогда?
Стандартный класс - кем то написан и является неизменяемой частью некого модуля - править нельзя.
Нужно - унаследовать ДВА раза - один раз наследовать расширенный класс, другой раз - непосредственно от расширенного - наследовать рабочий класс...
... или использовать трейты - элегантное решение.
Правда - есть несколько но - говорят, что при внедрении сложного трейта - тяжело писать тесты, ну и старые версии php их не поддерживают...
А так - очень даже упрощает жизнь.