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