Temat: Traits for php
Traitsy są jedną z najlepszych form wielodziedziczenia. Po pierwsze trait może zawierać tylko metody - odpadają konflikty dotyczące pól. Po drugie jeżeli wmiksujemy w klasę dwa traity z identycznymi nazwami metod otrzymamy błąd (można go obejść nadając alias na jakąś metodę). Po trzecie dzięki traitom możemy bardziej logicznie tworzyć drzewo klas, tak jak wynika to z modelowanego problemu, a nie dlatego, że przez koincydencje w dwóch zupełnie niezwiązanych klasach potrzebujemy mieć jakieś wspólne metody.
Prosty przykład:
załóżmy, że mamy dwie klasy np. User i Faktura, są one w zasadzie z zupełnie innych światów, załóżmy teraz, że chcemy sobie obiekty obu klas zapisywać w bazie danych, świadomie pomijając użycie orm-a można to rozwiązać np. tak że stworzyć wspólną klasę która nazywa się np. Record z której dziedziczą obie klasy i która ma metodę save, która zapisuje obiekt w bazie.
Od strony modelowania obiektowego taka hierarchia klas jest bez sensu, co ma Record z bazy danych do Użytkownika czy Faktury i co ma Użytkownik do Faktury (w sensie dziedziczenia)? Natomiast dzięki traitom możemy sobie stworzyć traita z metodą save i wmiksowac go w obie klasy.
Poza tym do traitów można przenieść powtarzający się kod z różnych hierarchii klas, które nie sposób ze sobą "pożenić", ograniczają więc użycie metodologi Copy'iego i Paste'a.
Btw. nie da się tej funkcjonalności w tej chwili uzyskać w aktualnej edycji języka na poziomie klasy, bo na poziomie obiektu jest to możliwe (strategy pattern i komponentyzacja).
Traity są obecne już od dłuższego czasu w innych językach np. Scali. Uważam, że to dobry dodatek do PHP, ale znając życie zawsze znajdzie się kilka osób które go będą nadużywały.