PHP - jest nadzieja

Dzisiejszy artykuł chciałbym poświęcić rozwojowi PHP - jako projektu samego w sobie. Będzie trochę historii, ale postaram się skupić głównie na tym co się zmienia i zmienia się na lepsze. Zapraszam do czytania.

PHP to język z dosyć długą historią - pierwsza wersja powstała w roku 1994. Często jednak rozumie się to jako wadę, a nie powiedzmy źródło doświadczenia wśród jego deweloperów. Różnorakie nieprzemyślane rozwiązania wymyślone i nagromadzone jeszcze w zeszłym stuleciu potrafią być bagażem po dziś dzień.

O PHP krąży nieprzypadkowo obiegowa opinia, że jest to język prawie tak ciężko reformowalny jak kościół katolicki w średniowieczu. Ma to oczywiście uzasadnienie: deweloperzy boją się wszelkich zmian zrywających kompatybilność wsteczną, bo jej zapewnienie buduje zaufanie ludzi tworzących w danej technologii. Nikt przecież nie chciałby przepisywać swoich aplikacji co dwa miesiące, prawda? W PHP doszło to jednak do bardzo wysokiego poziomu - latami starano się o wiele potrzebnych zmian, poprawek i rozliczeń z przeszłością. Prace nad ostatnią wersją major, czyli PHP5 zostały rozpoczęte jeszcze w 2002 roku. Stabilna wersja ukazała się na początku 2003. Znacząco poprawione zostały między innymi wszystkie rzeczy związane z programowaniem zorientowanym obiektowo. Można powiedzieć, że PHP wykonało susa do przodu i dogoniło ówczesną epokę pod wieloma względami.

Niewiele później, w okolicach wydania PHP 5.1, czyli w roku 2005 środowisko PHP zaczęło snuć plany na kolejną dużą wersję - hucznie zapowiadano rychłe nadejście PHP6, które miało poprawić rzeczy nie ruszane praktycznie od początku istnienia projektu - ujednolicić API, wprowadzić pełne wsparcie dla UTF-8 i poprawić wiele nieeleganckich i przestarzałych rozwiązań. Początkowy zapał jednak w miarę szybko osłabł, a tempo rozwoju dodatkowo osłabiły podzielone opinie wśród programistów samego języka - wielu z nich uważało, że planowane zmiany są zbyt radykalne oraz, że wymagają zbyt dużego nakładu czasowego. PHP6 szybko stało się martwym projektem, którego w zasadzie nikt na oczy nie widział, a jego rozwój został oficjalnie zawieszony w roku 2010.

Czas płynął, inne technologie dynamicznie się rozwijały, powstawały coraz bardziej nowoczesne rozwiązania. Dlatego ekipa PHP również postanowiła się pozbierać i wprowadzić część z rozwiązań planowanych na 6.x we wcześniejszych wersjach. Tak pojawiło się PHP 5.1 wprowadzające PDO, PHP 5.2 (listopad 2006) dodające wbudowane wsparcie dla formatów takich jak ZIP czy JSON oraz poprawiające zarządzanie pamięcią.

Kolejną wersją z piątej gałęzi, która ze względu na wprowadzone zmiany mocno zapadła w pamięci wielu programistów, była oznaczona numerkiem 5.3. Została ostatecznie wydana 30 czerwca 2009 roku i wprowadzała takie nowości jak przestrzenie nazw, domknięcia (clousures), mysqlnd (natywny driver MySQL) oraz poprawiająca obsługę modelu obiektowego.

Po tym kolejnym podgonieniu konkurencji, rozwój PHP ponownie jakby zamarł. Część środowiska nadal liczyła na szybkie ukończenie wersji 6 (której rozwój nie został wtedy jeszcze oficjalnie zdementowany), ale dla wielu stało się widoczne, że przez kilka kolejnych lat nie udało się wprowadzić praktycznie żadnych istotnych ulepszeń. Konkurencja gnała do przodu, a deweloperzy PHP grzęźli w wewnętrznych konfliktach.

Przełom nastąpił około roku 2012, czyli stosunkowo niedawno. Wtedy, po prawie 3 latach przerwy pojawiło się PHP 5.4 Można uczciwie powiedzieć, że próbowano znaleźć złoty środek między kompatybilnością z poprzednimi wydaniami i rozliczeniem się z błędami przeszłości.

  • usunięto często (i słusznie) krytykowane magic quotes, register globals oraz safe mode
  • usunięto składnię break/continue $var
  • usunięto między innymi funkcje import_request_variables(), session_is_registered(), session_register() i session_unregister()
  • wersje sqlite starsze niż 3 zostały wyrzucone do PECL
  • domyślnie wyłączono obsługę <? jednocześnie na stałe umożliwiając użycie składni <?=zmienna?> niezależnie od konfiguracji
  • wprowadzono uproszczoną składnię dla tablic ($array = [1, 2, 3])
  • umożliwiono array dereferencing (echo explode(' ', 'raz dwa')[1])
  • analogicznie pozwolono na zapis typu echo (new foo)-&gt;bar())
  • dodano wsparcie dla $this w domknięciach (clousures)
  • dodano traitsy
  • dodano wbudowany serwer developerski
  • duże poprawki wydajności

Ilość i "ciężar" wprowadzonych zmian, który jak na PHP był naprawdę duży odbił się szerokim echem. Był to głównie odbiór pozytywny, zazwyczaj ludzie cieszyli się, że pewne złe rozwiązania zostaną w końcu wyeliminowane siłowo. Przyspieszenie rozwoju nie było tak chwilowe jak poprzednio i już 20 czerwca 2013 pojawiło się wydanie 5.5. Tym razem zdecydowano się na następujące ulepszenia i kolejne rozliczenia z ciężarem dawnych wersji.

  • usunięto powodujące zagrożenie funkcje php_logo_guid(), php_egg_logo_guid(), php_real_logo_guid(), zend_logo_guid()
  • zdeprecjonowano wszystkie funkcje mysql_*
  • zdeprecjonowano flagę /e dla preg_replace()
  • zdeprecjonowano pewne funkcje z modułów mcrypt i intl
  • dodano generatory
  • dodano obsługę bloku finally
  • dodano nowe API dla hashowania
  • dodano wsparcie dla list() w foreach
  • dodano obsługę wyrażeń skalarnych w empty()

Lista zmian nie jest kompletna, tak jak dla PHP 5.4 skupiłem się na tym co najistotniejsze z punktu widzenia tego artykułu. Rozwój nadchodzącej wersji 5.6 obserwuję już na bieżąco i piszę już z własnych obserwacji takich miejsc jak GitHub oraz lista malingowa deweloperów PHP. Planowane/ukończone są obecnie następujące zmiany:

  • trzykrotne zmniejszenie zużycia pamięci dla danych POST
  • wbudowany debugger phpdbg
  • obsługa wyrażeń skalarnych dla const (podobnie jak wcześniej dla empty())
  • variadic functions i argument unpacking dzięki operatorowi ...
  • operator potęgowania (**)
  • obsługa uploadu plików większych niż 2GB
  • obsługa przestrzeni nazw dla funkcji
  • poprawki dla SSL i mcrypt
  • ustawienie domyślnego kodowania w php.ini dla funkcji takich jak htmlspecialchars()

Poza samymi zmianami w języku widać też zmianę podejścia w środowisku twórców. Podam na dzisiejszym przykładzie: kilka dni temu jeden z deweloperów zaproponował zmiany w rozszerzeniu mcrypt, które miały by bardziej rygorystycznie pilnować podawania soli dla haseł (jej brak miałby skutkować warningiem, a nie przemilczaniem błędu i obejściem jak jest obecnie). Mimo początkowego hałasu podniesionego o przerwanie kompatybilności wstecznej, zmiana została dziś dodana do gałęzi 5.6, mimo, że niedługo nadchodzi już wersja beta. To jedno wydarzenie pokazuje dosyć istotny postęp - niektóre zmiany, głównie związane z bezpieczeństwem, nawet takie które zepsują kilka skryptów, przechodzą po prostu łatwiej.

Ostatnio coraz więcej dyskusji toczy się także na temat zmian jakie chciano by zawrzeć w PHP6. Ponownie rozważana jest kwestia pełnego wsparcia dla UTF8 (kto musiał korzystać z funkcji mb_* wie o co chodzi), uporządkowanie API (ujednolicenie nazewnictwa funkcji i tak dalej) i porządkach w Zend Engine. Proponowane szkice zmian można znaleźć między innymi tutaj i tutaj. Jednocześnie głównym kierunkiem rozwoju pozostaje dotychczas wersja 5.7.

Co sądzicie o zmianach ostatnich lat, które zachodzą w PHP? Jest nadzieja? ;) A może cały rumor jaki się podniósł i używanie haseł takich jak "renesans PHP" jest Waszym zdaniem na wyrost?

Zapraszam do dyskusji :)

Komentarze wyłączone

Możliwość komentowania na blogu została wyłączona. Zapraszam do kontaktu na Twitterze, Facebooku lub poprzez formularz, o ten tutaj. Do usłyszenia!