WedługW3Techs, PHP jest używany przez 77,4% wszystkich stron internetowych, których język programowania po stronie serwera jest znany (stan 2022-05-07)[3].
Skrypty napisane w PHP są z reguły umieszczane w plikach tekstowych (czasami razem z kodemHTML lubXHTML). Dzięki temu PHP jest podobny w założeniach do coraz rzadziej stosowanego mechanizmuServer Side Includes[4]. PHP pozwala także na wykonywanie skryptów z linii poleceń podobnie jakPerl,Python orazRuby. Jego modułowa budowa daje również możliwość programowania samodzielnych aplikacji zinterfejsem graficznym. PHP umożliwia współpracę z wieloma rodzajami źródeł danych, takich jaksystemy zarządzania bazami danych, pliki tekstowe, dokumentyXML orazserwisy WWW.
Pierwsza wersja PHP, rozpowszechniana pod nazwą PHP/FI (Personal Home Page/FormsInterpreter), została stworzona przezRasmusa Lerdorfa w roku 1994 jako zestaw skryptów Perla służący do monitorowania internautów odwiedzających jego witrynę. Gdy ruch stał się zbyt duży, przepisał je w języku C, dodając przy tym nowe opcje. Niedługo później ludzie zaczęli prosić go o możliwość użycia tych narzędzi na swoich stronach, zatem 8 czerwca 1995 roku autor udostępnił publiczniekod źródłowy (PHP Tools 1.0). Już kilka miesięcy później projekt przekształcił się w zalążek znanego obecnie języka programowania, gdy został połączony z innym narzędziem Rasmusa Lerdorfa – Form Interpreter, które dało drugi człon nazwy. W 1997 roku pojawiło się PHP/FI 2.0, posiadające wtedy kilka tysięcy aktywnych użytkowników na całym świecie oraz obsługujące 50 tys. domen. Wersja ta spędziła większość „życia” na beta testach. Oficjalne wydanie było tylko jedno i ukazało się w listopadzie 1997 roku[5].
W 1997 roku projektem zainteresowali się dwaj izraelscy programiści:Zeev Suraski iAndi Gutmans. Odkryli oni, że PHP/FI ma zbyt małe możliwości na potrzeby aplikacjieCommerce, którą tworzyli na uniwersytecie. Zdecydowali wtedy, że przepiszą kod PHP całkowicie od nowa, korzystając z pomocy już istniejącej społeczności PHP. W czerwcu 1998 roku ogłosili PHP 3.0 jako następcę PHP/FI, którego dalszy rozwój został wtedy zatrzymany. Był to wielki krok naprzód. PHP 3.0 posiadało całkowicie nową architekturę, która znacznie zwiększała wydajność. Pojawiły się w niej zalążki programowania obiektowego, ale najważniejszą cechą aplikacji była jej modułowość. Użytkownicy mogli rozszerzać teraz funkcjonalność języka poprzez dodawanie nowych modułów.
Krótko po wydaniu PHP 3, w zimie 1998 Zeev Suraski oraz Andi Gutmans jeszcze raz zabrali się za przepisywanie kodu źródłowego PHP, korzystając z doświadczeń nabytych przy pracach nad poprzednią wersją. Za główne cele obrali poprawienie modułowości oraz wydajności złożonych aplikacji. Choć dotychczasowa wersja potrafiła sobie z nimi poradzić, nie była jednak stworzona do tego celu i przegrywała przez to z innymi rozwiązaniami.
W połowie roku 1999 ukazał się oficjalnieZend Engine, nowy silnik języka skryptowego, wokół którego niedługo później zaczęto budować PHP 4. Jego nazwa to kompromisowe połączenie imion twórców projektu. Nowa, oparta na nim wersja PHP, ukazała się w maju 2000 roku. Tak jak poprzednio, był to potężny krok naprzód. Programiści mieli do dyspozycji teraz wiele nowych narzędzi, konstrukcji językowych oraz bezpieczniejszy system wejścia/wyjścia. Od strony administracyjnej pojawiło się oficjalne wsparcie dla wielu nowych serwerów. Przez cztery lata od chwili wydania ukazały się trzy kolejne edycje tej wersji oznaczone numerami: 4.1, 4.2 oraz 4.3. W każdej z nich odczuwalne było zwiększenie bezpieczeństwa, szybkości działania oraz możliwości. W 2004 roku obsługiwały one łącznie 20% wszystkich domen sieciowych.
W 2002 roku Zeev Suraski oraz Andi Gutmans ponownie rozpoczęli znaczącą modernizację silnika PHP mającą na celu dodanie do tego języka modelu obiektowego z prawdziwego zdarzenia. W lutym 2003 ukazała się pierwsza wersja alpha nowej wersji PHP oznaczonej numerem 5.0.0. Stabilna wersja ukazała się prawie półtora roku później, w lipcu 2004 roku. Nowości sprawiły, że PHP może konkurować teraz z innymi rozwiązaniamiserver-side, jak równy z równym. Pojawił się całkowicie nowy model programowania obiektowego, przez co niestety została utracona część kompatybilności z poprzednimi wersjami PHP. Jest to spowodowane zmianą sposobu reprezentacji obiektów. W wersjach wcześniejszych obiekt był jednocześnie zmienną, co sprawiało duże trudności, dlatego też w wersji 5 na wzórJavy zmienna obiektowa stała się jedynie referencją do właściwego obiektu. Obecnie operacja przypisania powoduje powstanie drugiej referencji wskazującej na ten sam obiekt. Przebudowano także wiele modułów, w tym do obsługi XML-a i komunikacji z bazą danych, czyniąc je bardziej przyjaznymi dla programistów.Oprócz tego udostępniono zbiór interfejsów znacznie rozszerzających możliwości klas użytkownika[6]. Nastąpiły także zmiany oraz nowości w systemie modułów PHP. Funkcje obsługi języka XML zostały przepisane i wbudowane bezpośrednio w jądro aplikacji. Oprócz narzędzi obsługującychmodel DOM udostępniono SimpleXML – prosty interfejs do modyfikacji dokumentów XML. WprowadzonoSQLite, nowy, domyślnie „wkompilowany” silnik baz danych[7]. 24 listopada 2005 roku ukazała się wersja 5.1, w której pojawił sięPDO – ujednolicony sterownik orazpreprocesor zapytań umożliwiający komunikację z różnymi systemami baz danych. Kolejna wersja – 5.2, pojawiła się 2 listopada 2006 roku i skoncentrowana była na rozbudowie mechanizmów wejścia/wyjścia (obsługa formatów ZIP iJSON, filtry wejścia, obserwacja postępów przesyłania plików) i zarządzaniu pamięcią[8]. Ostatnim z tej gałęzi miało być wydanie 5.2.16[9], mające zakończyć okres oficjalnego wsparcia dla PHP 5.2. 6 stycznia 2011; ponad 14 lat temu wydano jednak wersję 5.2.17, która naprawia błąd mogący powodować zawieszenie serwera[10].
30 czerwca 2009 wydano PHP 5.3[11]. Główne zmiany obejmują wprowadzenie w języku obsługiprzestrzeni nazw. Pojawiły się równieżwyrażenia lambda i tzw.domknięcia (znane z takich języków jakJavaScript,Ruby czyLisp). Oprócz tego dopracowano również obsługęmetod statycznych i poprawiono działanie PHP pod systemem Windows, wprowadzając kompilację VC9 oraz eksperymentalne wersje binarne podx64. Ponadto wprowadzono mysqlnd – opcjonalny, natywny zamiennik PHP dla libmysql oraz poprawiono wiele błędów.
W połowie roku 2005 zaczęły pojawiać się oficjalne sygnały, że rozpoczęto wstępne prace nad PHP 6. Głównym celem jest dalsze dążenie do ujednolicenia projektu, wprowadzenia dalszych możliwości wymaganych przez złożone projekty (m.in. pełne wsparcie unicode czy system cache’owania kodu). Usuwane są też kolejne archaiczne rozwiązania pochodzące jeszcze z czasów PHP/FI oraz PHP3, co w przypadku najstarszych skryptów ponownie spowoduje problemy z kompatybilnością. Zmiany koncentrowały się przede wszystkim wokół wbudowania w język obsługiUnicode, dalszych usprawnień modelu obiektowego oraz wycofania obsługi wybranych,przestarzałych rozwiązań[12][13][14].
Przeciągające się prace nad PHP 6 sprawiły, że niektóre z planowanych wcześniej rozszerzeń takich, jak wprowadzenie przestrzeni nazw i funkcji anonimowych, dołączono już do wcześniejszych wersji, tworząc gałąź 5.3. Ostatecznie w marcu 2010 roku rozwój wersji 6.0 w dotychczasowym kształcie został oficjalnie zawieszony wskutek braku postępów w implementacji standarduUnicode oraz wewnętrznych sporów w gronie czołowych programistów[15][16]. W związku z tym gałąźtrunk, gdzie dotychczas trwał rozwój PHP 6, została zarchiwizowana, a następnie reaktywowana na bazie wersji5.3.0. W późniejszych miesiącach podjęto decyzję, że najbliższe nowe wydanie będzie nosić numer 5.4[17].
Prace nad nową główną wersją PHP, nazwaną PHP 7 rozpoczęły się oficjalnie w roku 2014. Wśród twórców rozgorzały dyskusje na temat nazwy następnego wydania PHP. Chociaż eksperymentalna wersja PHP 6, której celem było wprowadzenie wsparcia dla Unicode, nie została nigdy wydana, wiele artykułów i książek odwoływało się do starej nazwy PHP 6. Mogłoby to prowadzić do nieporozumień, gdyby nowe wydanie, zawierające inne funkcje, a niezawierające wsparcia dla Unicode, również nazywało się PHP 6[18]. W wyniku głosowania wybrano nazwę PHP 7[19].
Bazą PHP 7 stała się eksperymentalna gałąź, oryginalnie nazwanaPHPNG (PHP Next Generation), mająca na celu optymalizację wydajności PHP przezrefaktoryzację Zend Engine, zachowując niemal całkowitą zgodność języka. Począwszy od 14 lipca 2014 r., główny punkt odniesienia testowania wydajności PHPNG, którym jestWordPress, wskazuje niemal 100% wzrost wydajności[20]. Zmiany wprowadzone w PHPNG powinny również ułatwiać implementowanie usprawnień wydajności w przyszłości, ponieważ bardziej zwarte struktury danych oraz inne zmiany uważane są za lepiej nadające się do pomyślnej migracji dokompilacji Just-in-time[21].
PHP 7 wyróżnia się między innymi ulepszoną składnią zmiennych, wewnętrznie spójną i kompletną, co jest od dawna problemem w PHP. Pozwala to na użycie operatorów->,[],(),{} i:: z dowolnymi poprawnymi wyrażeniami po lewej[22]. Wersja ta dodaje także dwa nowe operatory –?? (znany z języków takich jakC#) oraz<=>. Pośród nowości znalazło się także kilka nowych funkcji, możliwość umieszczania tablic w stałych, czy klasy anonimowe. Jest to też pierwsza wersja, która w typowaniu argumentów funkcji pozwala na użycie typów skalarnych (string, integer, float, boolean). Wprowadzono również możliwość określenia typu zwracanego przez funkcję.
PHP 8 został wydany 26 listopada 2020 roku. Dodano między innymi typyunii,kompilator JIT (Just In Time), który ma poprawić wydajność stron internetowych. Oprócz tego wprowadzono:
nullsafe operator dla metod;
static jako typ zwracanej wartości, wcześniej dostępny był jednie self;
mixed – nowy typ wartości, który oznacza dowolny typ prosty;
WeakMaps – mechanizm do przechowywania referencji, który jednocześnie pozwala na ich usuwanie przezgarbage collector;
przechwytywanie wyjątków bez konieczności przypisania do zmiennej[23].
Poza nowościami naprawiono kilka kluczowych niedociągnięć. Między innymi static jest już zwracane prawidłowo[24].
Maskotką projektu PHP jestelePHPant, niebieskisłoń z logo PHP po swojej lewej stronie, zaprojektowany przez Vincenta Pontiera[25] w 1998 roku. Pojawił się też w grachSuperTuxKart(inne języki) iWarmux.
Darmowe moduły ootwartym źródle tworzone przez programistów z całego świata, przeznaczone do samodzielnejkompilacji. Począwszy od wydania PHP 5, do PECL przeniesionych zostało wiele wcześniejszych modułów oficjalnych, najczęściej tych niestabilnych lub rzadko używanych.
Zbiór realizujący typowe zadania klas o ujednoliconej budowie.
Zdecydowana większość modułów ma budowę proceduralną. Dopiero w PHP 5 rozpoczęto tworzenie w pełni obiektowych rozszerzeń oraz obiektowych zamienników starych funkcji.
Składnia PHP jest zapożyczona ze składni językówC,Java orazPerl.
<?php$a=5;$b=3;functionsuma($zmienna1,$zmienna2){$wynik=$zmienna1+$zmienna2;return$wynik;//Dodajemy argumenty i zwracamy wynik}echosuma($a,$b);// 8?>
Cały kod PHP musi zawierać się pomiędzy znacznikami:
<?php oraz?> – jedyny nieskrótowy tag zalecany przez PSR-1[26], wymienione jako dozwolone w podręczniku php.net[27]; PSR-2 nakazuje ominięcie znacznika końcowego, jeśli plik zawiera tylko kod PHP, a na końcu pliku musi zostać jedna, pusta linia[28], z kolei php.net jedynie zaleca ominięcie końcowego tagu, w takim przypadku[27]
<? oraz?> – niezalecane przez php.net z powodu mniejszej kompatybilności (wymaga włączeniashort_open_tag)[27]; użycie zabronione przez PSR-1[26], mimo warunkowego zezwolenia przez podręcznik php.net[27]
<?= oraz?> – powoduje wysłanie tekstu na wyjście (np.<?=$zmienna?> i ma taki sam wynik (tj. skrócona notacja) jak<?phpecho$zmienna;?>); jedyny skrótowy tag zalecany przez PSR-1[26] – nie mylić z dopuszczeniem<? oraz?>; nie wymaga włączeniashort_open_tag w wersjach PHP 5.4 i późniejszych[29]
<% oraz%> – tagi w styluASP; wymaga włączeniaasp_tags[30] (usunięto w PHP 7)
<?phpclassMojaKlasa{public$zm_publiczna;//definiowanie zmiennej publicznejprivate$zm_prywatna;//definiowanie zmiennej prywatnejprotected$zm_chroniona;//definiowanie zmiennej chronionejconstSTALA=124;//definiowanie stałej, stała musi zostać określona (jeśli nie - błąd składni)publicfunction__construct(){echo'Jestem konstruktorem klasy MojaKlasa. Za każdym razem gdy powołasz mój obiekt do życia, wykonam operacje zawarte w tej metodzie.<br />';}publicfunctionzrob_cos(){echo'Właśnie wykonywana jest funkcja zrob_cos()<br />';}publicfunction__destruct(){echo'Jestem destruktorem klasy MojaKlasa. Za każdym razem gdy usuniesz mój obiekt, wykonam operacje zawarte w tej metodzie.<br />';}}$mojobiekt=newMojaKlasa();//powoła do życia obiekt i wykona operacje zawarte w funkcji __construct()$mojobiekt->zrob_cos();// Wydrukuje komunikat//kiedy kończy się kod PHP, wszystkie zmienne są usuwane; wywoływana jest funkcja __destruct()?>
Zmienne w PHP nie wymagają deklaracji i nie posiadają jawnych typów. Jeżeli kontekst (na przykład definicja argumentu funkcji lub operator) danego wyrażenia wymaga zmiany jego typu, zostaje onorzutowane do typu wymaganego. Wśród obsługiwanych rodzajów danych znajdują się:
Przykładowo deskryptor pliku lub połączenie z bazą danych
Domyślnie PHP zawsze (pomijając obiekty od wersji 5) przekazuje zmienne przez wartość. Przekazywanie przez referencję zachodzi w wybranych funkcjach wbudowanych, oprócz tego można je narzucić w deklaracji własnej funkcji:
PHP jest wyposażone w szeroki wachlarz domyślnych funkcji. Niekonsekwencja w ich nazewnictwie (np. naprzemienne stosowanieCamelCase i znaku podkreślenia) jest niekiedy przedmiotem krytyki PHP. Znaczna część funkcji pochodzi jednak od ich odpowiedników w języku C i różnice pomiędzy nazwami funkcji wywodzą się właśnie z różnic w nazewnictwie z odpowiednich bibliotek C.
PHP obsługujerekurencję do poziomu około stu zagłębień. Jeślistos parsera zostanie przeciążony nadmierną ilością wywołań lub iteracji, wywołanie aplikacji zostanie przerwane.
Wersja 5 wprowadziłamechanizm wyjątków. Tylko część modułów powiadamia jednak użytkownika o wystąpieniu błędów za ich pośrednictwem; większość umieszcza je na wyjściu programu w miejscu ich wystąpienia.Przykład:
PHP obsługuje większość znanych baz danych: MySQL,PostgreSQL, Oracle, MS SQL, DB2. Poniżej przedstawiono wykonanie zapytania SQL na bazie danych MySQL przy pomocy biblioteki PDO dla PHP5:
<?phptry{$pdo=newPDO('mysql:host=localhost;dbname=articles','root','root');$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);$stmt=$pdo->query('SELECT id, name, content FROM articles ORDER BY id');echo'<ul>';foreach($stmtas$row){echo'<h1>'.$row['name'].'</h1>';echo$row['content'].'<hr />';}$stmt->closeCursor();echo'</ul>';}catch(PDOException$e){echo'Połączenie nie mogło zostać utworzone: '.$e->getMessage();}?>
W roku 1997 język PHP/FI obsługiwało około 50 tysięcydomen internetowych. Do roku 2005 udział PHP rósł. Później uległ stabilizacji na poziomie ok. 20 milionów domen[5][32] (9% wszystkich)[33]. Obecnie jest dominującym językiem programowania i obejmuje około 75% domen internetowych[34]. W 2020 roku w rankingu StackOverflow Developer Survey na najpopularniejsze technologie w kategorii języki programowanie, skryptów i znaczników zajął 8 miejsce[35].
W PHP powstała znaczna część obecnie istniejących aplikacji sieciowych. Należą do nich systemy zarządzania treścią, systemy forów dyskusyjnych, aplikacje pocztowe oraz klienci baz danych.