Wyjątkowość PHP

Podobno PHP5 jest językiem obiektowym, niektórzy twierdzą nawet, że językiem czwartej generacji. Ja bym go nazwał językiem obiektowalnym, bo zaiste, można w nim programować obiektowo, jednak sam język ani do tego nie zachęca, ani procesu nie ułatwia. Znakomita większość funkcji bibliotecznych obiektowości zwyczajnie nie obsługuje. Ciekawsze jednak są wyjątki, które w PHP są… niemal bezużyteczne.

Autorzy języka uznali, że najważniejsza jest zgodność wstecz za wszelką cenę. Zamiast jednak przygotować moduł, który dostarczałby API zgodnego ze starszymi wydaniami i zmodernizować rdzeń funkcjonalności bibliotecznej, postanowili ciągnąć za sobą brzemię średniowiecznych początków języka. Złośliwi mówią, że wystarczy zamienić część znaków dolara na małpki i otrzymamy poprawny kod Perla, a usuwając dolary w liniach deklaracji otrzymamy zgodność ze skryptami powłoki. Trudno się dziwić, bo szerokie możliwości języka to głównie posklejane kawałki bibliotek standardowych Perla i C, pomieszane z możliwościami powłoki. Faktycznie, jeśliby dodać do siebie procentowy udział języków pomnożony przez ich generację, to PHP okazuje się stać na czele i już tylko krok dzieli go od interpretacji języka naturalnego.

Nie o tym jednak chciałem pisać. Jedną z konsekwencji zachowania zgodności jest wyjątkowość języka, przejawiające się w braku wbudowanych wyjątków. Nie mam tu na myśli klasy Exception, mówię o tym, że żadna z funkcji bibliotecznych wyjątkami nie rzuca. Zwracają magiczne wartości, ustawiają liczniki błędów, ale wyjątków unikają jak ognia. Dlaczego? Może dlatego, że przeciętny konsument API o obiektowości, wyjątkach i wzorcach projektowych ma takie samo pojęcia, jak ja o ornitologii. Dlatego właśnie uważam, że wyjątki w PHP są niemal bezużyteczne.

$f = foo();
if (foo_error())
	return false;
if (!foo_write($f, 'bar'))
	return false;
if (!foo_write($f, 'baz'))
	return false;
foo_flush($f);
if (foo_error())
	return false;
foo_close($f);
if (foo_error())
	return false;

Czy tak powinien wyglądać kod? A może tak:

$result = true;
try
{
	$f = foo();
	$f->write('bar');
	$f->write('baz');
	$f->flush();
}
catch (FooException $e)
{
	$result = false;
}
finally
{
	if ($f)
		$f->close();
}
return $result;

Żeby móc osiągnąć czytelność drugiej wersji kodu, programista musi poświęcić kilka godzin na napisanie wrapperów dla większości bibliotecznych wywołań. W przeciwnym wypadku używanie wyjątków jest bezcelowe, bo i tak na każdym kroku trzeba kontrolować zwracane wartości. Czy jest tu zaszyta jakaś głębsza logika, czy słusznie wydaje mi się, że PHP5 wygląda na zaprojektowany na kolanie?

15 » odpowiedzi dla wpisu “Wyjątkowość PHP”


  1. 1 Wojtosz

    @Patrys
    Ogólnie (rozpatrując sesn całego przesłania) nie powiedziałeś nic nowego :) Ot, kolejny “niuans” PHP jakim zostaliśmy uraczeni
    .
    Każdy, kto trochę więcej w PHP pisał i tknął prawdziwych języków (C++, Python) odniesie wrażenie, że PHP to bałaganiarski język. To, co dzieje się z PHP obecnie to próba jego ujednolicenia, uspójnienia (jeśli moge się wyrazić w ten sposób).

    Pamiętasz zapewne wkroczenie na arenę PHP3 - rewolucja (rewolta ?) ;-)
    PHP tworzone było w chaotyczny sposób przez zbyt dużą grupę ludzi - a nie trudno w takich przypadkach zaprzeczyć, że prezentowali oni różne poziomy wiedzy. Efektem tego jest niekompatybilność PHP5 vs. PHP4 (że o trójce nie wspomnę).

    Co mamy dzisiaj ?
    PHP spogląda w stronę platformy .NET. Jedna po drugiej następują próby _odbadziewienia_ PHP (nie bójmy się tego sformuowania !), co widać np. czytając wzmianki o PHP6 (AFAIK chyba pisałem już kiedyś o tym na Twoim blogu). Tu będziemy mięli kolejne niekompatybilności z poprzednikami, ale w mojej opinii sytuacja zmieża w dobrą stronę i dobrze, że owa niekompatybilność z wcześniejszymi wersjami występuje.

    Życzę dobrze przespanej nocy :)

  2. 2 agaran

    Nie masz pojecia o ornitologii? nie wiesz co to ‘ptaszek’?

    ps. nie moglem siepowstrzymac

  3. 3 AdamK

    To nie jest kwestia kompatybilności (tak mnie się przynajmniej wydaje). W PHP5 w porównaniu do PHP4 są duże zmiany które powodują niekompatybilność.

    To o czym piszesz, to dodatkowe biblioteki. Jest ich w PHP całkiem sporo, i przepisanie wszystkiego od nowa ‘po obiektowemu’ zajmie trochę czasu. To się dzieje - zauważ że obecnie są np. dwa rodzaje współpracy z MYSQL - stara (nieobiektowa) i nowa (obiektowa).

    Po prostu PHP jest ofiarą swojej popularności - ma w tej chwili wielką inercję i nie da się wprowadzać zmian rewolucyjnie, trzeba to czynić ewolucyjnie.

  4. 4 smk

    Czepiasz się. Czepiasz się. Czepiasz się po trzykroć.

    PHP5 jest językiem obiektowym. Ma wsparcie dla wyjątków i to całkiem porządne.

    To, że uparłeś się używać standardowej biblioteki PHP3, to już Twoja własna decyzja. Biblioteki tworzone dla PHP5 tej “wady” nie mają.

    To tak jakbym ja, pisząc w D (który udostępnia dla wygody natywny interface do C), czepiałbym się, że stdlibc (glibc konkretnie), nie sygnalizuje mi błędów wyjątkami, nie wspiera programowania kontraktowego itd.

    Świadomie podjąłeś decyzję o używaniu prehistorycznej biblioteki, to świadomie licz się z tego konsekwencjami.

  5. 5 Wojtosz

    @smk

    e? przeczytaj raz jeszcze wpis by AdamK.
    “przepisanie wszystkiego od nowa ‘po obiektowemu’ zajmie trochę czasu” - wziąłeś pod uwagę, że w nowych rzeczach nie ma tych wszystkich funkcjonalności co w starych ?

    Przypuszczam, że do tego pije Patrys.

  6. 6 Zisurrin

    Z drugiej strony są osoby, które uważają, że nic lepszego od PHP4 już nie może być. Wystarczy popatrzeć, jakie głosy pojawiły się po rozpoczęciu akcji http://gophp5.org/ Także problemem mogą nie być tyle twórcy języka, co osoby, które go wykorzystują. To one będą hamowały przejście do nowych rozwiązań.

  7. 7 jarek .// wolnystrzelec.com

    Wojtosz : Chyba nawet nie chodzi o samo ‘zajmie trochę czasu’ tylko o parcie społeczności w tym kierunku - tworzenia kodu łatwiejszego do utrzymania, zrozumienia. Jednak w części firm oprogramowanie jest tworzone na zasadzie : tworzymy stronę, dodajemy 2 formularze i nazywamy je cms-em, oddajemy klientowi i “zapominamy”. Jednak gdy klient odezwie się po raz kolejny w celu dodania jakieś funkcjonalności , zaczynają się kłopoty (”hm… do czego to miało służyć…”). Ale miejmy nadzieję że z czasem się to zmieni.

  8. 8 mcv

    Ja mam chroniczny ból lewego małego palca od trzymania Shifta przy każdym znaku $. Muszę się „przezwyczaić” na wciskanie Shifta prawym małym palcem dla wszystkich znaków znajdujących się po lewej stronie klawiatury. ;-)

    PHP to właściwie jest nielogiczny. Nie mogę napisać:
    $x = $y->metoda()[0];

    Muszę:
    $z = $y->metoda();
    $x = $z[0];

  9. 9 Wojtosz

    @wolnystrzelec.com
    czy nie sadzisz, ze owo poparcie jest scisle z przeznaczonym na zmiany czasem powiazane ?

    odnosnie zapamietywania WTF funkcjonalnosci pozwole sobie zasugerowac prowadzenie dokumentacji. pomysl sprawdza sie od wielu lat :)

  10. 10 qwiat

    Patrys, najpierw chwalisz Pythona a potem ganisz PHP. To mi zalatuje hipokryzją. ;]

  11. 11 jarek .// wolnystrzelec.com

    @Wojtosz:
    Jednak sam czas nie sprawi że Ci ludzie zaczną tworzyć projekty inaczej.
    Miejmy nadzieje że z czasem zmusi ich do tego jakiś zamach stanu w php.net albo wymagania rynku :).

    “odnosnie zapamietywania WTF funkcjonalnosci….”
    Też tak uważam. Czego nie mogę powiedzieć o niektórych osobach których projekty muszę poszerzać/poprawiać :).

  12. 12 Atrakcyjny Wlodzimierz

    Lubię oświecać początkujących, więc dodam swoje dwa gr.
    Jak ktoś już wspomniał - wyjątki pojawiły się w PHP5, natomiast większość API pamięta wersje dużo starsze - nie zostało ono dostosowane do rzucania wyjątkami. Ale MOŻESZ, pisząc własny kod
    tymi wyjątkami rzucać. Dodatkowo, nowe biblioteki stawiają na Exceptions (chociażby To naprawdę proste.
    Zgodność wsteczna, wrappery. Nie rozumiesz ideii wyjątków.
    Mapowanie return false z throw Ex?
    To jest kwestia zaprojektowania nowej filozofii wykonywania pewnych czynnosci w ramach języka. Nikt tego nie obiecywał,
    za to klikacze mogą z powodzeniem używać wyjątków w ramach własnych klas. To bardzo użyteczne.

    Tak zupełnie gratis podpowiem, że chociażby w C++ bez rzutu wyjątkiem wewnątrz wywoływanej funkcji/metody twój kod będzie nadal sieczką if if if if if.

    Z początkiem postu oczywiście się zgodzę, bo PHP oczywiście obsysa, tyle że nocą jest księżyc, w dzień słońce, a spice girls są znowu razem. Czyt. “STARE” / “BYŁO” / “ZNOWU” / “DOBRY MELANŻ BYŁ?”

  13. 13 Patrys

    Atrakcyjny:

    Problemem nie jest to, że core pamięta czasy PHP3. Problemem jest to, że co i rusz na listach deweloperskich PHP czytam o tym, że “X się nie zmieni na model obiektowy, bo PHP ma mieć niski próg wejścia i łagodną krzywą nauki.” Z takim podejściem, to i w PHP7 nie będzie obiektowego dostępu do IO, gdzie wyjątki przydają się najbardziej, bo i najwięcej błędów tam się może pojawić.

  14. 14 acd

    Czy może mi ktoś powiedzieć co trzyma ludzi (developerów, managerów) przy PHP’ie, gdy dostępne sa platformy takie jak .Net albo RoR ?

    Cos w tym na pewno jest. Giganci tacy jak allegro nie mogli sie mylić.

  15. 15 mcv

    acd: Np. dostępność hostingu, z czego pokrętnymi drogami wynika liczba dostępnych programistów, z czego niekoniecznie pokrętnymi drogami wynika koszt zatrudnienia takiego programisty.

    A giganci zawsze się mogą mylić.

    PS: .NET ze swoim Yellow-screen-of-death to chyba też do szczęśliwych nie należy? ;-)

Skomentuj wpis