Developerzy PHP, projektując “nową” implementację OOP (nową w cudzysłowiu, bo raz że to było już kilka lat temu, a dwa, że dotyczy tylko i wyłącznie samego PHP), dość mocno wzorowali się na Javie. Czy to dobrze czy to źle to kwestia gustu, jednak wynika z tego kilka znaczących drobiazgów. Jednym z nich jest jednodziedziczenie (czyli że jedna klasa w PHP może mieć tylko jedną klasę bazową). Od zawsze uważałem to za dużą niewygodę ;) Jak widać, nie tylko ja.
Padła propozycja dołączenia systemu “Cech” (ang. Traits) do PHP (podejrzewam że do wersji 6, ale to tylko moje zgadywanie - w każdym bądź razie są gotowe łatki m.in. do 5.2 i 5.3). Do czego służą Traitsy? W sumie… do obejście problemu jednodziedziczenia, czyli do wprowadzenia wielodziedziczenia.
Trzeba pamiętać, że ten mechanizm został podobno (nie sprawdzałem osobiście) sportowany także do Javy i C#, natomiast nie istnieje jeszcze ofiacjalna wersja dla PHP. Sam “wygląd” kodu, słowa kluczowe etc nie są jeszcze ustalone, ale to tylko szczegóły.
Szczegóły są dostępne w oficjalnym RFC: stefan-marr.de/artikel/rfc-traits-for-php.html. Ja tylko powiem, że da się często obejść niedogodność wynikajacą z braku wielodziedziczenia, ale problem leży właśnie w konieczności obchodzenia braków w języku (tak, wiem, to akurat jedna z typowych wojen wyższości jednych świąt nad drugimi ;) ale to akurat moje zdanie ;) ). Prostszym wyjściem byłoby wprowadzenie po prostu możliwości posiadania kilku klas bazowych, ale w to nie wnikam. Ja ogólnie jestem na tak.
Ogólnie tez jestem na tak. Nawet bardzo.
Adres bezpośredni: http://urzenia.net/361/cechy-w-php-traits/#comment-33312
Wydaje się trochę bez sęnsu upierać się przy jednobazowym dziedziczeniu ale dodawać coś co ma działać zupełnie jak wielobazowe. :/
Adres bezpośredni: http://urzenia.net/361/cechy-w-php-traits/#comment-33313
A jestem na nie. Zupełnie nie. Z wielu powodów.
Po pierwsze - nie ma takich problemów, których nie załatwiłaby POPRAWNIE zaprojektowana kooperacja obiektów. Nawet skomplikowane problemy z szalejącą zmiennością zachowań czy dodawaniem funkcjonalności do istniejących obiektów można ŁATWO rozwiązać używając sprawdzonych rozwiązań.
Po drugie - KISS. Dziedziczenie wielobazowe jest podstępne i skomplikowane, zarówno w używaniu jak i implementacji w samym języku. Śledzenie kodu bez type hinting (niewielu programistów PHP tego używa) jest i tak trudne, by dokładać sobie analizę problemu w górę hierarchii traitsów.
Po trzecie - większość developerów ma IQ na poziomie kłody drewna. Poprawiając po kimś kod pisany z użyciem traitsów będziesz płakał gorzkimi łzami. Jestem więcej niż pewien, że jakiś zółtodziób użyje traitsów by zapewnić wspólną funkcjonalność obiektom, a później okaże się, że jednak funkcjonalność ta powinna nieco różnić się w jednej i drugiej klasie. Wówczas zapewne pojawi się ze dwadzieścia if-ów albo switch na sto case-ów (zawsze mi to robią!).
Po czwarte - sprzeczność semantyczna. Co ma wspólnego kamieniarz kujący kamienie i student kujący do egzaminu? Traits to właśnie implementacja kucia bez wskazywania kto jest wykonawcą - z tego powodu traits dokładają całą klasę problemów do programowania.
Z resztą, rantowałem już o tym jakiś czas temu, stare dzieje.
Adres bezpośredni: http://urzenia.net/361/cechy-w-php-traits/#comment-33323
Wiem, dyskutowaliśmy na ten temat na Twoim joggu ;)
Dopowiem to co może nie za jasno napisałem wcześniej: ja nie naciskam akurat na traitsy, które są tylko próbą naprawienia tego co spieprzono wcześniej. Wystarczy wprowadzić wielodziedziczenie, i traitsy nie są do niczego potrzebne ;)
Adres bezpośredni: http://urzenia.net/361/cechy-w-php-traits/#comment-33324
[...] bardziej ruszył mnie punkt dotyczący wielokrotnego dziedziczenia, ale płakał też nie będę. Cóż, tak samo jak z punktem poprzednim, da się żyć bez [...]
Adres bezpośredni: http://urzenia.net/361/cechy-w-php-traits/#comment-33334