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.


Liczba komentarzy: 5

  1. 1 Była niedziela, 24 Luty 2008 roku gdy o godzinie 00:05 przyszedł scanner i stwierdził:

    Ogólnie tez jestem na tak. Nawet bardzo.

  2. 2 Był wtorek, 26 Luty 2008 roku gdy o godzinie 17:47 przyszedł Smialy i stwierdził:

    Wydaje się trochę bez sęnsu upierać się przy jednobazowym dziedziczeniu ale dodawać coś co ma działać zupełnie jak wielobazowe. :/

  3. 3 Była środa, 19 Marzec 2008 roku gdy o godzinie 15:43 przyszedł Michał Słaby i stwierdził:

    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.

  4. 4 Była środa, 19 Marzec 2008 roku gdy o godzinie 18:47 przyszedł MySZ i stwierdził:

    A jestem na nie. Zupełnie nie.

    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 ;)

  5. 5 Był piątek, 11 Kwiecień 2008 roku gdy o godzinie 08:51 przyszedł myGeeBlog » Blog Archive » Słówko o PHP6 i stwierdził:

    [...] 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 [...]

A Ty? Co o tym myślisz?

Możesz używać w komentarzach następujących znaczników:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Sblam! Antyspam