Traits представляют группу методов, которые могут быть добавлены в классы. Traits позволяют определять блоки функционала и многократно повторно использовать в классах без необходимости усложнять код классов, которые используют эти методы.
Traits определяются с помощью ключевого словва trait, после которого идет название трейта:
trait Printer { }
Traits могут содержать только статические и нестатические методы:
trait Printer
{
public function printSimpleText($text) { echo "$text<br>"; }
public function printHeaderText($text) { echo "<h2>$text<h2>"; }
}
Для применения классов трейта применяется оператор use, после которого указывается добавляемый трейт:
trait Printer
{
public function printSimpleText($text) { echo "$text<br>"; }
public function printHeaderText($text) { echo "<h2>$text<h2>"; }
}
class Message
{
use Printer;
}
$myMessage = new Message();
$myMessage->printSimpleText("Hello World!");
$myMessage->printHeaderText("Hello PHP 8");
После добавления трейта с помощью оператора use класс может использовать его методы, как-будто они определены в самом этом классе.
Следует учитывать, что при наследовании методы трейта переопределяют унаследованные методы с тем же именем:
class Data
{
function print() { echo "Print from Data"; }
}
trait Printer
{
function print() { echo "Print from Printer"; }
}
class Message extends Data
{
use Printer;
}
$myMessage = new Message();
$myMessage->print(); // Print from Printer