Η php από την έκδοση 5.4 και μετά έχει τη δυνατότητα χρήσης των traits, όπου ένα απλός μηχανισμός με το οποίο μπορούμε να ελαχιστοποιήσουμε τη χρήση του διπλότυπου κώδικα.

PHP Traits είναι καλό εργαλείο διότι επιτρέπουν σττους developers να γράψουν μεθόδους όπου μπορούν να χρησιμοποιηθούν σε οποιαδήποτε κλάσσεις κρατώντας το πηγαίο κώδικα καθαρό.

Ο βασική χρησιμότηταα αυτού του εργαλείου ωφείλετα στο ότι η PHP, αυτό γιατί είναι μια γλώσσα προγραμματισμού η οποία ανήκει στη κατηγορία single inheritance languages, αυτό σημαίνει ότι μία κλάση δεν μπορεί κληρονομήσει μεθόδους από πολλαπλές κλάσεις.

Τα PHP traits είναι κλάσεις από τις οποίες δεν μπορούν να δημιουργηθούν στιγμιότυπα (objects) αλλά είναι χρήσιμα στην εξάλειψη του συχνά επαναλαμβανόμενου κώδικα. Μοιάζουν με abstract class αλλά η κύρια η διαφορά είναι δεν χρειάζεται να γίνει implementation της κληρονομικότητας, όπως είναι υποχρεωτικό σε μία abstract class.

Τα abstact χρησιμοποιούνται ως πρότυπο και περιέχουν λειτουργικές μεθόδους για να καθοριστεί ο τρόπος συμπεριφοράς σε child classes. Βασικές έννοιες και το συστηματικό refactoring του πηγαίου κώδικο είναι απαραίτητο στο toolkit κάθε php developer.

Αλλά ας συνεχίσουμε να δούμε τη διαφορά ενός trait με ένα  interface, όπου αποτελεί ένα blueprint για κλάσει που θα κάνουν implement συγκεκριμένες μεθόδους δηλαδή υποχρεώνει ένα συγκεκριμενο τρόπο συμπεριφοράς σε κλάσεις που θα κάνουν implement το interface

Τρόπος χρήσης 

 trait message
{
       public function hello()
       {
           return "hello";
       }
}

class user()
{
  use message;
}

$user = new user();
$user->hello();

Πραγματικό Παράδειγμα

Ένα παράδειγμα πραγματικής χρήσης είναι στο πακέτο ανοιχτού κώδικα Laravel Cashier όπου δίνει τη δυνατότητα δημιουργίας subscriptions σε web εφαρμογές. Απλά μπορούμε να δούμε τη χρήση ενός trait αν εξετάσουμε το πηγαίο κώδικα απλά παρατηρήστε

https://github.com/laravel/cashier/blob/9.0/src/Billable.php

Έχει δημιουργήσει ένα trait Billable με βασικές μεθόδους

Charge, Refund, hasCardOnFile, tab, invoiceFor, newSubscription, onTrial

Πότε θα χρησιμοποιούμε  treats

Ο πιο κατάλληλη χρήση μια τέτοια κλάσης είναι όταν θέλουμε να χρησιμοποιήσουμε ένα κομμάτι κώδικά σε πόλλες κλάσεις οι οποίες δεν  συσχετίζονται μεταξύ τους άμεσα. Μόνος τα Trait μπορουν γίνουν mixin  σε διαφορετικά μέρη στην ιεραρχία των κλάσεων.