Trait v PHP je mechanismus pro opakované použití kódu, který řeší omezení jednoduché dědičnosti. Umožňuje sdílet metody mezi více třídami bez nutnosti vytvářet společného předka.

Tedy je to takový include v OOP který vloží metody a property do třídy. Platí základní principy jako u OOP. Trait se chová jako třída, ale nemá magic methody jako je třeba konstruktor.

Popis

Trait není třída ani rozhraní. Slouží jako kontejner metod (a vlastností), které lze vložit do tříd pomocí klíčového slova use. Trait nemůže být instanciován samostatně a nemůže dědit od jiné třídy.

Hlavní vlastnosti traitů:

Použití

Trait se definuje pomocí klíčového slova trait a ve třídě se použije pomocí use.

Příklad:

trait LoggerTrait
{
    public function log(string $message): void
    {
        echo $message;
    }
}

class Service
{
    use LoggerTrait;
}

$logS = new Service();
$logS->log("ahoj"); // vypíše slovo "ahoj" i dkyž ve třídě Service není metoda log(), ta je vkládána do třídy Service skrze trait.

Třída Service má po použití traitu k dispozici metodu log, jako by byla definována přímo ve třídě.

Vysvětlení

Traity jsou vhodné v situacích, kdy více nesouvisejících tříd potřebuje stejnou funkcionalitu (např. logování, práce s časem, validace). Na rozdíl od dědičnosti nenutí do hierarchického vztahu.

Pokud dojde ke konfliktu názvů metod mezi více traity, PHP vyžaduje explicitní řešení pomocí insteadof nebo as. To zajišťuje jednoznačné chování a čitelnost kódu.

Trait by měl obsahovat pouze logicky související funkcionalitu a neměl by nahrazovat špatně navrženou architekturu tříd.

Demonstrace použití traitů i s overridingem pro dosažení maximální míry znovupoužitelnosti

https://gist.github.com/jakubforman/4b8664bd3cc1a2bff6daf372f5a34808