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

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

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

Τα 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 PHP Framework στο πακέτο ανοιχτού κώδικα 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  σε διαφορετικά μέρη στην ιεραρχία των κλάσεων.