PHP - PHP

PHP
PHP-logo.svg
Paradygmat Wieloparadygmat : imperatyw , funkcjonalny , obiektowy , proceduralny , refleksyjny
Zaprojektowany przez Rasmus Lerdorf
Deweloper Zespół programistów PHP, Zend Technologies
Po raz pierwszy pojawiły się 8 czerwca 1995 ; 26 lat temu ( 1995-06-08 )
Wersja stabilna
8.0.11  Edytuj to na Wikidanych /23 września 2021 r .; 24 dni temu ( 23 września 2021 )
Wersja zapoznawcza
8.1.0 Beta 1/22  Edytuj to na Wikidanych lipca 2021 r .; 2 miesiące temu ( 22 lipca 2021 )
Dyscyplina pisania Dynamiczny , słaby

od wersji 7.0:

Stopniowy
Język implementacji C (głównie; niektóre komponenty C++ )
OS Uniksowy , Windows , macOS , IBM i , OpenVMS
Licencja Licencja PHP (większość silnika Zend na licencji Zend Engine )
Rozszerzenia nazw plików .php, .phar, .phtml, .pht,.phps
Strona internetowa www .php .net Edytuj to na Wikidata
Główne wdrożenia
Zend Engine , HHVM , PeachPie , Quercus , Parrot
Wpływem
Perl , HTML , C , C++ , Java , Tcl , JavaScript , Hack
Pod wpływem
Hack , JSP , ASP

PHP jest językiem skryptowym ogólnego przeznaczenia , przeznaczonym do tworzenia stron internetowych . Została pierwotnie stworzona przez duńsko-kanadyjskiego programistę Rasmusa Lerdorfa w 1994 roku. Implementacja referencyjna PHP jest obecnie produkowana przez The PHP Group. PHP pierwotnie oznaczało Personal Home Page , ale teraz oznacza rekurencyjny inicjalizm PHP: Hypertext Preprocessor .

Kod PHP jest zwykle przetwarzany na serwerze WWW przez interpreter PHP zaimplementowany jako moduł , demon lub jako plik wykonywalny Common Gateway Interface (CGI). Na serwerze WWW wynik zinterpretowanego i wykonanego kodu PHP – którym może być dowolny rodzaj danych, taki jak wygenerowany kod HTML lub binarne dane obrazu – stanowiłby całość lub część odpowiedzi HTTP . Istnieją różne systemy szablonów internetowych , systemy zarządzania treścią internetową i struktury internetowe , które można wykorzystać do organizowania lub ułatwiania generowania odpowiedzi. Dodatkowo PHP może być używane do wielu zadań programistycznych poza kontekstem sieciowym, takich jak samodzielne aplikacje graficzne i sterowanie robotami dronowymi . Kod PHP można również wykonać bezpośrednio z wiersza poleceń .

Standardowy interpreter PHP, oparty na silniku Zend , jest wolnym oprogramowaniem wydanym na licencji PHP . PHP został szeroko przeniesiony i może być wdrażany na większości serwerów WWW na różnych systemach operacyjnych i platformach .

Język PHP ewoluował bez pisemnej formalnej specyfikacji lub standardu do 2014 roku, przy czym pierwotna implementacja działała jako de facto standard, do którego dążyły inne implementacje. Od 2014 roku trwają prace nad stworzeniem formalnej specyfikacji PHP.

W3Techs informuje, że od kwietnia 2021 r. „PHP jest używany przez 79,2% wszystkich stron internetowych, których język programowania po stronie serwera znamy”.

Historia

Wczesna historia

Rasmus Lerdorf , który napisał oryginalny komponent Common Gateway Interface (CGI), wraz z Andi Gutmans i Zeev Suraski , który przepisał parser tworzący PHP 3.

Rozwój PHP rozpoczął się w 1994 roku, kiedy Rasmus Lerdorf napisał kilka programów Common Gateway Interface (CGI) w C , których używał do prowadzenia swojej osobistej strony domowej . Rozszerzył je o pracę z formularzami internetowymi i komunikację z bazami danych i nazwał tę implementację "Personal Home Page/Forms Interpreter" lub PHP/FI.

PHP/FI może być używany do tworzenia prostych, dynamicznych aplikacji internetowych . Aby przyspieszyć zgłaszanie błędów i ulepszyć kod, Lerdorf początkowo ogłosił wydanie PHP/FI jako „Personal Home Page Tools (PHP Tools) w wersji 1.0” na grupie dyskusyjnej Usenet comp.infosystems.www.authoring.cgi 8 czerwca 1995 r. Ta wersja miała już podstawową funkcjonalność, którą PHP ma dzisiaj. Obejmuje to zmienne w stylu Perla , obsługę formularzy i możliwość osadzania HTML . Składnia przypominał Perl , ale było prostsze, bardziej ograniczona i mniej spójne.

Przykład wczesnej składni PHP :

<!--include /text/header.html-->

<!--getenv HTTP_USER_AGENT-->
<!--if substr $exec_result Mozilla-->
  Hey, you are using Netscape!<p>
<!--endif-->

<!--sql database select * from table where user='$username'-->
<!--ifless $numentries 1-->
  Sorry, that record does not exist<p>
<!--endif exit-->
  Welcome <!--$user-->!<p>
  You have <!--$index:0--> credits left in your account.<p>

<!--include /text/footer.html-->

Wczesny PHP nie miał być nowym językiem programowania i rósł organicznie, a Lerdorf zauważył z perspektywy czasu: „Nie wiem, jak to powstrzymać, nigdy nie miałem zamiaru napisać języka programowania [...] Mam absolutnie nie mam pojęcia, jak napisać język programowania, po prostu dodawałem kolejny logiczny krok po drodze. Zaczął się tworzyć zespół programistów, który po miesiącach pracy i testów beta oficjalnie udostępnił PHP/FI 2 w listopadzie 1997 roku.

Fakt, że PHP nie został pierwotnie zaprojektowany, ale został opracowany organicznie, doprowadził do niespójnego nazewnictwa funkcji i niespójnej kolejności ich parametrów. W niektórych przypadkach nazwy funkcji były wybierane tak, aby pasowały do ​​bibliotek niższego poziomu, które PHP "zawijało", podczas gdy w bardzo wczesnych wersjach PHP długość nazw funkcji była używana wewnętrznie jako funkcja mieszająca , więc nazwy zostały wybrane tak, aby poprawić dystrybucję wartości skrótu .

PHP 3 i 4

To jest przykład niestandardowego kodu PHP dla systemu zarządzania treścią WordPress .

Zeev Suraski i Andi Gutmans przepisali parser w 1997 roku i stworzyli podstawę PHP 3, zmieniając nazwę języka na rekurencyjny akronim PHP: Hypertext Preprocessor . Następnie rozpoczęły się publiczne testy PHP 3, a oficjalna premiera miała miejsce w czerwcu 1998 roku. Suraski i Gutmans rozpoczęli przepisywanie rdzenia PHP, produkując silnik Zend w 1999 roku. Założyli również Zend Technologies w Ramat Gan w Izraelu .

22 maja 2000 wydano PHP 4, oparte na silniku Zend Engine 1.0. Do sierpnia 2008 ta gałąź osiągnęła wersję 4.4.9. PHP 4 nie jest już w fazie rozwoju i nie planuje się wydania żadnych aktualizacji bezpieczeństwa.

PHP 5

1 lipca 2004 wydano PHP 5, oparte na nowym silniku Zend Engine II. PHP 5 zawiera nowe funkcje, takie jak ulepszona obsługa programowania obiektowego , rozszerzenie PHP Data Objects (PDO) (definiujące lekki i spójny interfejs dostępu do baz danych) oraz liczne ulepszenia wydajności. W 2008 roku PHP 5 stało się jedyną stabilną wersją w fazie rozwoju. W poprzednich wersjach PHP brakowało późnego wiązania statycznego, które zostało dodane w wersji 5.3.

Wiele głośnych projektów open-source przestało obsługiwać PHP 4 w nowym kodzie od 5 lutego 2008 z powodu inicjatywy GoPHP5, dostarczonej przez konsorcjum programistów PHP promujące przejście z PHP 4 na PHP 5.

Z czasem interpretery PHP stały się dostępne w większości istniejących 32-bitowych i 64-bitowych systemów operacyjnych, budując je z kodu źródłowego PHP lub używając gotowych plików binarnych. W przypadku wersji PHP 5.3 i 5.4 jedynymi dostępnymi dystrybucjami binarnymi Microsoft Windows były 32-bitowe kompilacje IA-32 , wymagające trybu zgodności z 32-bitowym systemem Windows podczas korzystania z Internetowych usług informacyjnych (IIS) na 64-bitowej platformie Windows. Wersja PHP 5.5 udostępniła 64-bitowe kompilacje x86-64 dla systemu Microsoft Windows.

Oficjalne wsparcie bezpieczeństwa dla PHP 5.6 zakończyło się 31 grudnia 2018 roku.

PHP 6 i Unicode

PHP otrzymał mieszane recenzje z powodu braku natywnej obsługi Unicode na poziomie języka podstawowego. W 2005 roku zainicjowano projekt kierowany przez Andrieja Zmievskiego, który miał na celu wprowadzenie natywnej obsługi Unicode w całym PHP, poprzez osadzenie biblioteki International Components for Unicode (ICU) i reprezentowanie ciągów tekstowych jako UTF-16 wewnętrznie. Ponieważ spowodowałoby to poważne zmiany zarówno we wnętrzu języka, jak i w kodzie użytkownika, zaplanowano wydanie go jako wersji 6.0 języka, wraz z innymi ważnymi funkcjami, które były wówczas w fazie rozwoju.

Jednak brak programistów, którzy zrozumieli niezbędne zmiany, oraz problemy z wydajnością wynikające z konwersji do i z UTF-16, rzadko używanego w kontekście sieciowym, doprowadziły do ​​opóźnień w projekcie. W rezultacie w 2009 r. powstało wydanie PHP 5.3, w którym wiele funkcji innych niż Unicode zostało przeniesionych z PHP 6, w szczególności przestrzenie nazw. W marcu 2010 r. projekt w obecnej formie został oficjalnie porzucony i przygotowano wydanie PHP 5.4 zawierające większość pozostałych nie-Unicode funkcji z PHP 6, takich jak cechy i ponowne wiązanie zamknięć. Początkowe nadzieje były takie, że powstanie nowy plan integracji Unicode, ale do 2014 roku żaden nie został przyjęty.

PHP 7

W latach 2014 i 2015 opracowano nową główną wersję PHP, PHP 7. Numeracja tej wersji wywołała pewną debatę wśród wewnętrznych programistów. Chociaż eksperyment PHP 6 Unicode nigdy nie został wydany, kilka artykułów i tytułów książek odnosiło się do nazwy PHP 6, co mogło spowodować zamieszanie, gdyby nowe wydanie miało ponownie użyć tej nazwy. Po głosowaniu wybrano nazwę PHP 7.

Podstawą PHP 7 jest gałąź PHP, która pierwotnie została nazwana PHP następną generacją ( phppng ). Jego autorami byli Dmitry Stogov, Xinchen Hui i Nikita Popov, a jego celem było zoptymalizowanie wydajności PHP poprzez refaktoryzację silnika Zend przy zachowaniu niemal pełnej kompatybilności językowej. Do 14 lipca 2014 r. testy porównawcze oparte na WordPressie , które służyły jako główny zestaw testów porównawczych dla projektu phppng, wykazały prawie 100% wzrost wydajności. Zmiany wprowadzone w phppng ułatwiają poprawę wydajności w przyszłych wersjach, ponieważ bardziej zwarte struktury danych i inne zmiany są postrzegane jako lepiej dostosowane do pomyślnej migracji do kompilatora just-in-time (JIT). Ze względu na znaczące zmiany, przerobiony silnik Zend został nazwany Zend Engine 3 , zastępując silnik Zend 2 używany w PHP 5.

Z powodu dużych wewnętrznych zmian w php, musi otrzymać nowy główny numer wersji PHP, a nie mniejsze wydanie PHP 5, zgodnie z procesem wydawania PHP. Główne wersje PHP mogą łamać wsteczną kompatybilność kodu i dlatego PHP 7 dało okazję do innych ulepszeń poza phppng, które wymagają zerwania wstecznej kompatybilności. W szczególności dotyczyło to następujących zmian:

  • Wiele starszych mechanizmów błędów PHP na poziomie krytycznym lub możliwym do odzyskania zostało zastąpionych nowoczesnymi wyjątkami zorientowanymi obiektowo .
  • Składnia zmiennej dereferencing został przerobiony być wewnętrznie bardziej spójna i kompletna, co pozwala na korzystanie z operatorów ->, [], (), {}, i ::, z dowolnych sensownych wyrażeń lewej ubocznych.
  • Obsługa starszych metod konstruktorów PHP w stylu 4 została wycofana.
  • Zmieniono zachowanie foreachoświadczenia, aby było bardziej przewidywalne.
  • Konstruktory dla kilku klas wbudowanych w PHP, które zwracały wartość null w przypadku niepowodzenia, zostały zmienione tak, aby zamiast tego zgłaszały wyjątek dla zachowania spójności.
  • Kilka nieutrzymywanych lub przestarzałych interfejsów programowania aplikacji serwera (SAPI) i rozszerzeń zostało usuniętych z rdzenia PHP, w szczególności starszego mysqlrozszerzenia.
  • Zmieniono zachowanie list()operatora, aby usunąć obsługę ciągów.
  • Usunięto obsługę starszych ograniczników w stylu ASP <%oraz %>i <script language="php"> ... </script>.
  • Naprawiono przeoczenie, dzięki któremu instrukcja switch może mieć wiele defaultklauzul.
  • Usunięto obsługę obsługi liczb szesnastkowych w niektórych niejawnych konwersjach z ciągów na typy liczb.
  • Operatorzy zmiany biegów w lewo i w prawo zmieniono, aby zachowywali się bardziej spójnie na różnych platformach.
  • Konwersje między liczbami zmiennoprzecinkowymi a liczbami całkowitymi zostały zmienione (np. nieskończoność zmieniona na zero) i zaimplementowana bardziej spójnie na różnych platformach.

PHP 7 zawiera również nowe funkcje językowe. Przede wszystkim wprowadzono deklaracje zwracanego typu dla funkcji, które uzupełniają istniejące deklaracje typu parametrów, oraz obsługę typów skalarnych (integer, float, string i boolean) w deklaracjach parametrów i zwracanych typów.

PHP 8

PHP 8 zostało wydane 26 listopada 2020 r. PHP 8 jest główną wersją i zawiera przełomowe zmiany w stosunku do poprzednich wersji. Nowe funkcje i godne uwagi zmiany obejmują:

Kompilacja just-in-time

Kompilacja just-in-time jest obsługiwana w PHP 8.

Kompilator JIT PHP 8 może zapewnić znaczną poprawę wydajności w niektórych przypadkach użycia. Programista PHP Nikita Popov stwierdził, że poprawa wydajności większości stron internetowych będzie mniej znacząca niż aktualizacja z PHP 5 do PHP 7. Oczekuje się, że poprawa wydajności spowodowana dodaniem kompilatora JIT będzie bardziej znacząca w przypadku operacji typu matematycznego niż w przypadku typowe przypadki użycia do tworzenia stron internetowych. Dodatkowo kompilator JIT zapewnia przyszły potencjał przeniesienia części kodu z C do PHP, ze względu na poprawę wydajności w niektórych przypadkach użycia.

Dodanie wyrażenia dopasowania

PHP 8 wprowadziło matchwyrażenie. Wyrażenie match jest koncepcyjnie podobne do switchinstrukcji i jest bardziej zwarte w niektórych przypadkach użycia. Ponieważ matchjest wyrażeniem, jego wynik może zostać przechwycony w zmiennej lub zwrócony z funkcji.

Wpisz zmiany i uzupełnienia

PHP 8 wprowadziło typy unii, nowy statictyp zwracany i nowy mixedtyp.

„Atrybuty”, często określane jako „adnotacje” w innych językach programowania, zostały dodane w PHP 8, co pozwala na dodawanie metadanych do klas.

throwzostała zmieniona z wyrażenia na wyrażenie. Pozwala to na rzucanie wyjątków w miejscach, które wcześniej nie były możliwe.

Zmiany składni i dodatki

PHP 8 zawiera zmiany umożliwiające alternatywne, bardziej zwięzłe lub bardziej spójne składnie w wielu scenariuszach. Na przykład operator nullsafe jest podobny do operatora łączenia wartości null ?? , ale jest używany podczas wywoływania metod. Poniższy fragment kodu nie getBirthday()zwróci błędu, jeśli zwróci wartość null:

$human_readable_date = $user->getBirthday()?->diffForHumans();

Promocja właściwości konstruktora została dodana jako „ cukier syntaktyczny ”, umożliwiając automatyczne ustawianie właściwości klasy, gdy parametry są przekazywane do konstruktora klasy . Zmniejsza to ilość kodu, który należy napisać.

Inne drobne zmiany obejmują wsparcie dla użycia ::classna obiektach, które służy jako alternatywa dla użycia get_class(); połowy nieprzechwytujące w blokach try-catch; poprawki składni zmiennych w celu rozwiązania niespójności; obsługa nazwanych argumentów; oraz obsługę końcowych przecinków na listach parametrów, co zwiększa spójność z obsługą końcowych przecinków w innych kontekstach, na przykład w tablicach.

Zmiany i uzupełnienia w standardowej bibliotece

  • Słabe mapy zostały dodane w PHP 8. A WeakMapzawiera odniesienia do obiektów, ale te odniesienia nie zapobiegają zbieraniu śmieci . Może to zapewnić poprawę wydajności w scenariuszach, w których dane są buforowane ; ma to szczególne znaczenie w przypadku ORM .
  • Różne dostosowania interfejsów, takie jak dodanie obsługi tworzenia DateTimeobiektów z interfejsów oraz dodanie Stringableinterfejsu, który może być używany do podpowiedzi typu.
  • Różne nowe funkcje, w tym str_contains(), str_starts_with() i str_ends_with(); fdiv(); get_debug_type(); i get_resource_id()
  • Implementacja obiektu token_get_all()

Dodatkowe zmiany

  • Adnotacje typu zostały również dodane do samego kodu źródłowego PHP w języku C, aby umożliwić wewnętrznym funkcjom i metodom "pełną informację o typie w odbiciu".
  • Dziedziczenie metodami prywatnymi
  • Metody abstrakcyjne w poprawie cech

Historia wydań

Wersja Data wydania Obsługiwane do Uwagi
Stara wersja, nie jest już utrzymywana: 1,0 8 czerwca 1995 r. Oficjalnie nazywane „Narzędziami osobistej strony głównej (Narzędzia PHP)”. Jest to pierwsze użycie nazwy „PHP”.
Stara wersja, nie jest już utrzymywana: 2,0 1 listopada 1997 r. Oficjalnie nazywany „PHP/FI 2.0”. Jest to pierwsze wydanie, które można określić jako PHP, jako samodzielny język z wieloma funkcjami, które przetrwały do ​​dnia dzisiejszego.
Stara wersja, nie jest już utrzymywana: 3,0 6 czerwca 1998 20 października 2000 Rozwój przechodzi od jednej osoby do wielu programistów. Zeev Suraski i Andi Gutmans przepisują bazę dla tej wersji.
Stara wersja, nie jest już utrzymywana: 4.0 22 maja 2000 23 czerwca 2001 Dodano bardziej zaawansowany dwustopniowy system parsowania/wykonywania tagów, zwany silnikiem Zend.
Stara wersja, nie jest już utrzymywana: 4.1 10 grudnia 2001 12 marca 2002 r. Wprowadzono „superglobale” ( $_GET, $_POST, $_SESSION, itd.)
Stara wersja, nie jest już utrzymywana: 4.2 22 kwietnia 2002 r. 6 września 2002 r. register_globalsDomyślnie wyłączone . Dane otrzymane przez sieć nie są już wstawiane bezpośrednio do globalnej przestrzeni nazw, zamykając ewentualne luki w zabezpieczeniach aplikacji.
Stara wersja, nie jest już utrzymywana: 4.3 27 grudnia 2002 r. 31 marca 2005 r. Wprowadzono interfejs wiersza poleceń (CLI), jako uzupełnienie CGI.
Stara wersja, nie jest już utrzymywana: 4.4 11 lipca 2005 r. 7 sierpnia 2008 Naprawiono błąd powodujący uszkodzenie pamięci, który wymagał zerwania kompatybilności binarnej z rozszerzeniami skompilowanymi względem PHP w wersji 4.3.x.
Stara wersja, nie jest już utrzymywana: 5.0 13 lipca 2004 r. 5 września 2005 r. Zend Engine II z nowym modelem obiektowym.
Stara wersja, nie jest już utrzymywana: 5.1 24 listopada 2005 r. 24 sierpnia 2006 Poprawa wydajności dzięki wprowadzeniu zmiennych kompilatora w przebudowanym silniku PHP. Dodano obiekty danych PHP (PDO) jako spójny interfejs dostępu do baz danych.
Stara wersja, nie jest już utrzymywana: 5.2 2 listopada 2006 6 stycznia 2011 Domyślnie włączone rozszerzenie filtra. Natywna obsługa JSON .
Stara wersja, nie jest już utrzymywana: 5,3 30 czerwca 2009 14 sierpnia 2014 Obsługa przestrzeni nazw ; późne wiązania statyczne , etykieta skoku (ograniczone goto ), funkcje anonimowe , zamknięcia , archiwa PHP (phar), wyrzucanie śmieci dla odwołań cyklicznych, ulepszona obsługa Windows , sqlite3, mysqlnd jako zamiennik dla libmysql jako podstawowa biblioteka dla rozszerzeń współpracujących z MySQL , fileinfo jako zamiennik mime_magic dla lepszej obsługi MIME , rozszerzenia internacjonalizacji i wycofania rozszerzenia ereg.
Stara wersja, nie jest już utrzymywana: 5.4 1 marca 2012 3 września 2015 Obsługa cech, obsługa krótkiej składni tablic. Usunięte elementy: register_globals, safe_mode, allow_call_time_pass_reference, , i . Wbudowany serwer WWW. Kilka ulepszeń istniejących funkcji, wydajności i zmniejszone wymagania dotyczące pamięci. session_register()session_unregister()session_is_registered()
Stara wersja, nie jest już utrzymywana: 5,5 20 czerwca 2013 10 lipca 2016 Wsparcie dla generatorów , finallybloków do obsługi wyjątków, OpCache (oparty na Zend Optimizer+) w oficjalnej dystrybucji.
Stara wersja, nie jest już utrzymywana: 5,6 28 sierpnia 2014 31 grudnia 2018 Stałe wyrażenia skalarne, funkcje wariadyczne , rozpakowywanie argumentów, nowy operator potęgowania, rozszerzenia useinstrukcji dla funkcji i stałych, nowy phpdbgdebugger jako moduł SAPI i inne mniejsze ulepszenia.
6.x Nie wydany Nie dotyczy Porzucona wersja PHP, która planowała zawierać natywną obsługę Unicode.
Stara wersja, nie jest już utrzymywana: 7,0 3 grudnia 2015 10 stycznia 2019 Zend Engine 3 (poprawa wydajności i obsługa 64-bitowych liczb całkowitych w systemie Windows), ujednolicona składnia zmiennych, proces kompilacji oparty na AST , dodano spójność przesunięcia bitowego na różnych platformach, operator ( koalescencja zerowa ), składnia ucieczki punktów kodowych Unicode , deklaracje typu zwracanego, deklaracje typu skalarnego (integer, float, string i boolean), operator porównania trójstronnego "statek kosmiczny" , delegowanie generatora , klasy anonimowe , prostsze i bardziej konsekwentnie dostępne API CSPRNG , zastąpienie wielu pozostałych wewnętrznych "błędów" PHP nowszymi wyjątkami i skróconą składnię do importowania wielu elementów z przestrzeni nazw. Closure::call()??<=>
Stara wersja, nie jest już utrzymywana: 7,1 1 grudnia 2016 1 grudnia 2019 r. void return type , modyfikatory stałej widoczności klasy
Stara wersja, nie jest już utrzymywana: 7,2 30 listopada 2017 30 listopada 2020 Deklaracja parametru obiektu i zwracanego typu, rozszerzenie Libsodium, nadpisywanie metody abstrakcyjnej, poszerzenie typu parametru
Starsza wersja, ale nadal utrzymywana: 7,3 6 grudnia 2018 6 grudnia 2021 Elastyczne składni heredoc i składnię Nowdoc wsparcie dla przydzielania odniesienia i tablicy rozbiórki z listy), wsparcie (PCRE2, hrtime () funkcji
Starsza wersja, ale nadal utrzymywana: 7,4 28 listopada 2019 r. 28 listopada 2022 Wpisane właściwości 2.0, wstępne ładowanie, operator przypisania zerowej koalescencji, poprawa openssl_random_pseudo_bytes, Weak References, FFI – interfejs funkcji obcych , zawsze dostępne rozszerzenie hash, rejestr hashów haseł, dzielenie ciągów wielobajtowych, odbicie dla referencji, unbundle ext/wddx, nowa serializacja obiektów niestandardowych mechanizm
Aktualna stabilna wersja: 8,0 26 listopada 2020 26 listopada 2023 Kompilacja Just-In-Time (JIT) , tablice zaczynające się od ujemnego indeksu, bardziej rygorystyczna/rozsądna semantyka języka (walidacja metod cech abstrakcyjnych), rozsądniejsze porównania ciągów do liczb, rozsądniejsze ciągi liczbowe, błąd typu TypeError w przypadku nieprawidłowych operatorów arytmetycznych/bitowych, reklasyfikacja różne błędy silnika, spójne błędy typów dla funkcji wewnętrznych, błąd krytyczny dla niezgodnych sygnatur metod), niezależna od ustawień regionalnych konwersja zmiennoprzecinkowa na ciąg znaków, poprawki składni zmiennych, atrybuty, nazwane argumenty, wyrażenie dopasowania, promocja właściwości konstruktora, typy unii, typ mieszany, statyczne typ zwracany, operator nullsafe, nie przechwytujące połowy, wyrażenie rzutu, rozszerzenie JSON jest zawsze dostępne.
Przyszłe wydanie: 8.1 25 listopada 2021 ?? Listopad 2024 Wyraźna ósemkowa notacja dosłowna, wyliczenia
Legenda:
Stara wersja
Starsza wersja, nadal utrzymywana
Ostatnia wersja
Najnowsza wersja zapoznawcza
Przyszłe wydanie

Od 28 czerwca 2011 r. zespół programistów PHP wdrożył harmonogram wydawania nowych wersji PHP. W ramach tego systemu co miesiąc powinno następować co najmniej jedno wydanie. Raz w roku powinna pojawić się wersja pomniejsza, która może zawierać nowe funkcje. Każde wydanie drugorzędne powinno być wspierane przez co najmniej dwa lata z poprawkami bezpieczeństwa i błędów, a następnie co najmniej rok tylko z poprawkami bezpieczeństwa, co daje łącznie trzyletni proces wydawania dla każdego wydania drugorzędnego. Żadne nowe funkcje, z wyjątkiem niewielkich i samodzielnych, nie mogą być wprowadzane do wersji drugorzędnej podczas trzyletniego procesu wydania.

Maskotka

ElePHPant, maskotka PHP

Maskotką projektu PHP jest elePHPant , niebieski słoń z logo PHP na boku, zaprojektowany przez Vincenta Pontiera w 1998 roku. "Litery (PHP) tworzyły kształt słonia patrząc z boku". Słoń w postaci pluszowej zabawki bywa różnie zabarwiony .

Na przestrzeni lat powstało wiele odmian tej maskotki. Tylko słonie oparte na oryginalnym projekcie Vincenta Pontiera są uważane przez społeczność za oficjalne. Są to przedmioty kolekcjonerskie, a niektóre z nich są niezwykle rzadkie.

Składnia

Aplikacja "Hello World" w PHP 7.4 działająca na serwerze programistycznym localhost

Następujące „Witaj świecie!” program jest napisany w kodzie PHP osadzonym w dokumencie HTML :

<!DOCTYPE html>
<html>
    <head>
        <title>PHP "Hello, World!" program</title>
    </head>
    <body>
        <?php
            echo '<p>Hello, World!</p>';
        ?>
    </body>
</html>

Ponieważ jednak nie ma wymogu, aby kod PHP był osadzony w HTML, najprostsza wersja Hello, World! można napisać w ten sposób, z pominięciem zamykającego znacznika jako preferowanego w plikach zawierających czysty kod PHP ?>

<?php
    echo 'Hello, World!';
?>

Interpreter PHP wykonuje kod PHP tylko w obrębie jego ograniczników . Wszystko poza jego ogranicznikami nie jest przetwarzane przez PHP, chociaż tekst inny niż PHP nadal podlega strukturom kontrolnym opisanym w kodzie PHP. Najczęstszymi ogranicznikami są <?phpotwieranie i zamykanie sekcji PHP. Istnieje również forma skrócona . Ten krótki ogranicznik sprawia, że ​​pliki skryptów są mniej przenośne, ponieważ ich obsługa może być wyłączona w lokalnej konfiguracji PHP i dlatego jest to odradzane. I odwrotnie, nie ma rekomendacji przeciwko krótkiemu tagowi echo . Przed PHP 5.4.0 ta krótka składnia działa tylko z włączonym ustawieniem konfiguracyjnym, podczas gdy dla PHP 5.4.0 i nowszych jest zawsze dostępna. Celem wszystkich tych ograniczników jest oddzielenie kodu PHP od treści innych niż PHP, takich jak kod JavaScript lub znaczniki HTML. A więc najkrótsze „Hello, World!” program napisany w PHP to: ?><?<?=echoshort_open_tag

<?='Hello, World!';

Pierwsza forma ograniczników <?phporaz , w XHTML i innych dokumentach XML , tworzy poprawnie uformowane instrukcje przetwarzania XML. Oznacza to, że wynikowa mieszanka kodu PHP i innych znaczników w pliku po stronie serwera sama w sobie jest dobrze sformatowanym kodem XML. ?>

Zmienne są poprzedzone symbolem dolara , a typ nie musi być z góry określone. W PHP 5 wprowadzono deklaracje typów, które pozwalają funkcjom wymuszać, aby ich parametry były obiektami określonej klasy, tablic, interfejsów lub funkcji zwrotnych . Jednak przed PHP 7 deklaracje typu nie mogły być używane z typami skalarnymi, takimi jak integer lub string.

Poniżej znajduje się przykład deklarowania i inicjowania zmiennych PHP.

<?php
    $name = 'John';  // variable of string type being declared and Initialized
    $age = 18;       // variable of integer type being declared and Initialized
    $height = 5.3;   // variable of double type being declared and Initialized
    echo $name . ' is ' . $height . 'm tall\n'; // concatenating variables and strings
    echo "$name is $age years old."; // interpolating variables to string
?>

W przeciwieństwie do nazw funkcji i klas, w nazwach zmiennych rozróżniana jest wielkość liter. Zarówno łańcuchy w cudzysłowie (""), jak i heredoc umożliwiają interpolację wartości zmiennej do łańcucha. PHP traktuje znaki nowej linii jako białe znaki na sposób języka swobodnego , a instrukcje są kończone średnikiem. PHP ma trzy rodzaje składni komentarzy : /* */znaczniki blokowe i komentarze w tekście; //lub #są używane do komentarzy jednowierszowych. echoStwierdzenie jest jednym z kilku obiektów PHP zapewnia do tekstu wyjściowego.

Pod względem słów kluczowych i składni języka PHP jest podobny do składni stylu C. ifwarunki, fororaz whilepętle i zwroty funkcja jest podobna do składni języków takich jak C, C ++, C #, Java i Perl.

Typy danych

PHP jest luźno wpisany . Przechowuje liczby całkowite w zakresie zależne od platformy, albo jako 32, 64 lub 128-bitowe podpisane całkowitą odpowiednikiem języka C typu long . Liczby całkowite bez znaku są konwertowane na wartości ze znakiem w pewnych sytuacjach, co różni się zachowaniem od wielu innych języków programowania. Zmienne całkowite można przypisywać za pomocą notacji dziesiętnej (dodatniej i ujemnej), ósemkowej , szesnastkowej i binarnej .

Liczby zmiennoprzecinkowe są również przechowywane w zakresie specyficznym dla platformy. Można je określić za pomocą notacji zmiennoprzecinkowej lub dwóch form notacji naukowej . PHP ma natywny typ Boolean, który jest podobny do natywnych typów Boolean w Javie i C++ . Korzystając z reguł konwersji typu Boolean, wartości niezerowe są interpretowane jako prawda, a zero jako fałsz, tak jak w Perl i C++.

Typ danych null reprezentuje zmienną, która nie ma wartości; NULLjest jedyną dozwoloną wartością dla tego typu danych.

Zmienne typu „resource” reprezentują odwołania do zasobów ze źródeł zewnętrznych. Są one zwykle tworzone przez funkcje z określonego rozszerzenia i mogą być przetwarzane tylko przez funkcje z tego samego rozszerzenia; przykłady obejmują pliki, obrazy i zasoby bazy danych.

Tablice mogą zawierać elementy dowolnego typu, które PHP może obsłużyć, w tym zasoby, obiekty, a nawet inne tablice. Porządek jest zachowywany na listach wartości oraz w skrótach zarówno z kluczami, jak i wartościami, a oba te elementy mogą być przemieszane. PHP obsługuje również łańcuchy , które mogą być używane z pojedynczymi cudzysłowami, podwójnymi cudzysłowami, składnią nowdoc lub heredoc .

Standardowy PHP Library (SPL) próbuje rozwiązać standardowe problemy i realizuje wydajne interfejsy dostępu do danych i klas.

Funkcje

PHP definiuje szeroką gamę funkcji w języku podstawowym, a wiele z nich jest również dostępnych w różnych rozszerzeniach; funkcje te są dobrze udokumentowane w dokumentacji PHP online . Jednak wbudowana biblioteka ma wiele różnych konwencji nazewnictwa i związanych z nimi niespójności, jak opisano w powyższej części historii .

Deweloper może zdefiniować funkcje niestandardowe:

function myAge(int $birthYear): string
{
    // calculate the age by subtracting the birth year from the current year.
    $yearsOld = date('Y') - $birthYear;

    // return the age in a descriptive string.
    return $yearsOld . ' year' . ($yearsOld != 1 ? 's':'');
}

echo 'I am currently ' . myAge(1995) . ' old.';

W 2021 r. wynik powyższego przykładowego programu to „Mam obecnie 26 lat”.

Zamiast wskaźników do funkcji , do funkcji w PHP można się odwoływać za pomocą ciągu znaków zawierającego ich nazwę. W ten sposób normalne funkcje PHP mogą być używane, na przykład, jako wywołania zwrotne lub wewnątrz tabel funkcji . Funkcje zdefiniowane przez użytkownika mogą być tworzone w dowolnym momencie bez prototypowania . Funkcje mogą być definiowane wewnątrz bloków kodu, co pozwala na podjęcie decyzji w czasie wykonywania, czy funkcja powinna być zdefiniowana. Istnieje function_existsfunkcja, która określa, czy funkcja o podanej nazwie została już zdefiniowana. Wywołania funkcji muszą używać nawiasów, z wyjątkiem funkcji konstruktora klasy z zerowymi argumentami wywoływanych z operatorem PHP new, w których nawiasy są opcjonalne.

Do PHP 5.3 obsługa anonimowych funkcji i zamknięć nie istniała w PHP. Chociaż create_function()istnieje od PHP 4.0.1, jest tylko cienkim opakowaniem, eval()które pozwala na tworzenie normalnych funkcji PHP podczas wykonywania programu. PHP 5.3 dodał składnię definiującą anonimową funkcję lub " zamknięcie ", które może przechwytywać zmienne z otaczającego zakresu. W PHP 7.4 dodano skróconą składnię strzałek:

function getAdder($x) {
    return fn($y) => $x + $y;
}

$adder = getAdder(8);
echo $adder(2); // prints "10"

W powyższym przykładzie getAdder()funkcja tworzy zamknięcie używając przekazanego argumentu $x(słowo kluczowe useimportuje zmienną z kontekstu leksykalnego), który pobiera dodatkowy argument $yi zwraca utworzone zamknięcie do wywołującego. Taka funkcja jest obiektem pierwszej klasy, co oznacza, że ​​może być przechowywana w zmiennej, przekazywana jako parametr do innych funkcji itp.

Nietypowo dla języka z typami dynamicznymi, PHP obsługuje deklaracje typu na parametrach funkcji, które są wymuszane w czasie wykonywania. Jest to obsługiwane dla klas i interfejsów od PHP 5.0, dla tablic od PHP 5.1, dla "callables" od PHP 5.4 i typów skalarnych (integer, float, string i boolean) od PHP 7.0. PHP 7.0 posiada również deklaracje typów dla typów zwracanych przez funkcje, wyrażone przez umieszczenie nazwy typu po liście parametrów, poprzedzonej dwukropkiem. Na przykład getAdderfunkcja z wcześniejszego przykładu może być opisana typami takimi jak w PHP 7:

function getAdder(int $x): Closure
{
    return fn(int $y): int => $x + $y;
}

$adder = getAdder(8);
echo $adder(2); // prints "10"
echo $adder(null); // throws an exception because an incorrect type was passed
$adder = getAdder([]); // would also throw an exception

Domyślnie deklaracje typu skalarnego są zgodne ze słabymi zasadami typowania. Tak więc, na przykład, jeśli typ parametru to int, PHP pozwoli nie tylko na liczby całkowite, ale także na konwertowalne ciągi numeryczne, zmienne zmiennoprzecinkowe lub wartości logiczne, które będą przekazywane do tej funkcji i przekonwertuje je. Jednak PHP 7 ma tryb "ścisłego wpisywania", który, gdy jest używany, uniemożliwia takie konwersje dla wywołań funkcji i zwraca w obrębie pliku.

Obiekty PHP

Podstawowa funkcjonalność programowania obiektowego została dodana w PHP 3 i ulepszona w PHP 4. Pozwoliło to na uzyskanie większej abstrakcji PHP, ułatwiając kreatywne zadania programistom używającym języka. Obsługa obiektów została całkowicie przepisana dla PHP 5, rozszerzając zestaw funkcji i zwiększając wydajność. W poprzednich wersjach PHP obiekty były obsługiwane jak typy wartości . Wadą tej metody było to, że kod musiał intensywnie korzystać ze zmiennych "referencyjnych" PHP, jeśli chciał zmodyfikować przekazany obiekt, zamiast tworzyć jego kopię. W nowym podejściu do obiektów odwołuje się handle , a nie wartość.

PHP 5 wprowadzono prywatne i chronione zmienne składowe i metod, wraz z klasami abstrakcyjnymi , klas końcowych , abstrakcyjnych metod i sposobów końcowych . Wprowadzono również standardowy sposób deklarowania konstruktorów i destruktorów , podobny do innych języków zorientowanych obiektowo, takich jak C++ , oraz standardowy model obsługi wyjątków . Ponadto PHP 5 dodało interfejsy i pozwoliło na zaimplementowanie wielu interfejsów. Istnieją specjalne interfejsy umożliwiające interakcję obiektów z systemem wykonawczym. Obiekty implementujące ArrayAccess mogą być używane ze składnią tablicy, a obiekty implementujące Iterator lub IteratorAggregate mogą być używane z foreach konstrukcją języka . W silniku nie ma funkcji wirtualnej tabeli , więc zmienne statyczne są wiązane z nazwą zamiast odniesienia w czasie kompilacji.

Jeśli programista utworzy kopię obiektu używając zastrzeżonego słowa clone, silnik Zend sprawdzi, czy __clone()metoda została zdefiniowana. Jeśli nie, wywoła wartość domyślną, __clone()która skopiuje właściwości obiektu. Jeśli __clone()metoda jest zdefiniowana, to będzie odpowiedzialna za ustawienie niezbędnych właściwości w tworzonym obiekcie. Dla wygody silnik dostarczy funkcję importującą właściwości obiektu źródłowego, dzięki czemu programista może rozpocząć od repliki obiektu źródłowego według wartości i nadpisać tylko te właściwości, które muszą zostać zmienione.

Widoczność właściwości i metod PHP jest definiowana za pomocą słów kluczowych public , privateoraz protected. Wartość domyślna to public, jeśli używana jest tylko var ; varjest synonimem public. Zadeklarowane pozycje publicsą dostępne wszędzie. protectedogranicza dostęp do klas dziedziczonych (i do klasy definiującej element). privateogranicza widoczność tylko do klasy, która definiuje element. Obiekty tego samego typu mają dostęp do swoich prywatnych i chronionych członków, nawet jeśli nie są tym samym wystąpieniem.

Przykład

Poniżej znajduje się podstawowy przykład programowania obiektowego w PHP 8:

<?php

abstract class User
{
    protected string $name;

    public function __construct(string $name)
    {
        // make first letter uppercase and the rest lowercase
        $this->name = ucfirst(strtolower($name));
    }

    public function greet(): string
    {
        return "Hello, my name is " . $this->name;
    }

    abstract public function job(): string;
}

class Student extends User
{
    public function __construct(string $name, private string $course)
    {
        parent::__construct($name);
    }

    public function job(): string
    {
        return "I learn " . $this->course;
    }
}

class Teacher extends User
{
    public function __construct(string $name, private array $teachingCourses)
    {
        parent::__construct($name);
    }

    public function job(): string
    {
        return "I teach " . implode(", ", $this->teachingCourses);
    }
}

$students = [
    new Student("Alice", "Computer Science"),
    new Student("BOB", "Computer Science"),
    new Student("Charlie", "Business Studies"),
];

$teachers = [
    new Teacher("Dan", ["Computer Science", "Information Security"]),
    new Teacher("Erin", ["Computer Science", "3D Graphics Programming"]),
    new Teacher("Frankie", ["Online Marketing", "Business Studies", "E-commerce"]),
];

foreach ([$students, $teachers] as $users) {
    echo $users[0]::class . "s:\n";

    array_walk($users, function (User $user) {
        echo "{$user->greet()}, {$user->job()}\n";
    });
}

// Output of program:
// Students:
// Hello, my name is Alice, I learn Computer Science
// Hello, my name is Bob, I learn Computer Science
// Hello, my name is Charlie, I learn Business Studies
// Teachers:
// Hello, my name is Dan, I teach Computer Science, Information Security
// Hello, my name is Erin, I teach Computer Science, 3D Graphics Programming
// Hello, my name is Frankie, I teach Online Marketing, Business Studies, E-commerce

Realizacje

Jedyną kompletną implementacją PHP jest oryginalna, znana po prostu jako PHP. Jest najczęściej używany i jest zasilany przez silnik Zend . Aby odróżnić go od innych implementacji, czasami nazywa się go nieoficjalnie "Zend PHP". Zend Engine kompiluje kod źródłowy PHP w locie do wewnętrznego formatu, który może wykonać, dzięki czemu działa jako interpreter . Jest to również "referencyjna implementacja" PHP, ponieważ PHP nie ma formalnej specyfikacji, a semantyka Zend PHP definiuje semantykę PHP. Ze względu na złożoną i zniuansowaną semantykę PHP, zdefiniowaną przez sposób działania Zend, konkurencyjnym wdrożeniom trudno jest zapewnić pełną kompatybilność.

Model PHP pojedynczego żądania na wykonanie skryptu oraz fakt, że silnik Zend jest interpreterem, prowadzi do nieefektywności; w rezultacie opracowano różne produkty, które pomagają poprawić wydajność PHP. Aby przyspieszyć czas wykonania i nie musieć kompilować kodu źródłowego PHP za każdym razem, gdy odwiedzana jest strona internetowa, skrypty PHP można również wdrożyć w wewnętrznym formacie silnika PHP za pomocą pamięci podręcznej kodu opcode , która działa poprzez buforowanie skompilowanej postaci skrypt PHP (opkody) w pamięci współdzielonej, aby uniknąć obciążenia związanego z analizowaniem i kompilowaniem kodu przy każdym uruchomieniu skryptu. Pamięć podręczna kodu operacji , Zend Opcache , jest wbudowana w PHP od wersji 5.5. Innym przykładem powszechnie używanej pamięci podręcznej kodu operacyjnego jest alternatywna pamięć podręczna PHP (APC), która jest dostępna jako rozszerzenie PECL .

Chociaż Zend PHP jest nadal najpopularniejszą implementacją, opracowano kilka innych implementacji. Niektóre z nich są kompilatorami lub obsługują kompilację JIT , a zatem oferują większą wydajność niż Zend PHP kosztem braku pełnej kompatybilności z PHP. Alternatywne implementacje obejmują:

  • HHVM (HipHop Virtual Machine) – opracowany na Facebooku i dostępny jako open source, konwertuje kod PHP na kod bajtowy wysokiego poziomu (powszechnie znany jako język pośredni ), który jest następnie dynamicznie tłumaczony na kod maszynowy x86-64 w czasie wykonywania przez Kompilator just-in-time (JIT), co skutkuje nawet 6-krotną poprawą wydajności. Jednak od wersji 7.2 Zend przewyższa HHVM, a HHVM 3.24 jest ostatnią wersją, która oficjalnie obsługuje PHP.
  • Parrot  – maszyna wirtualna zaprojektowana do wydajnego uruchamiania języków dynamicznych; Pipp przekształca kod źródłowy PHP w pośrednią reprezentację Parrota , która jest następnie tłumaczona na kod bajtowy Parrota i wykonywana przez maszynę wirtualną.
  • PeachPie – kompilator drugiej generacji do . Kod bajtowy NET Common Intermediate Language (CIL), zbudowany na platformie Roslyn ; następca Phalangera, dzielący kilka elementów architektonicznych
  • Phalanger  – kompiluje PHP do kodu bajtowego Common Intermediate Language (CIL); poprzednik PeachPie
  • Quercus  – kompiluje PHP do kodu bajtowego Javy
  • HipHop  – opracowany na Facebooku i dostępny jako open source, przekształca skrypty PHP w kod C++, a następnie kompiluje powstały kod, zmniejszając obciążenie serwera nawet o 50%. Na początku 2013 roku Facebook zrezygnował z niego na rzecz HHVM z wielu powodów, w tym trudności we wdrożeniu i braku wsparcia dla całego języka PHP, w tym konstrukcji create_function()i eval().

Koncesjonowanie

PHP to darmowe oprogramowanie wydane na licencji PHP , która stanowi, że:

Produkty pochodzące z tego oprogramowania nie mogą być nazywane „PHP”, ani „PHP” nie może pojawiać się w ich nazwie, bez uprzedniej pisemnej zgody group@php.net. Możesz wskazać, że Twoje oprogramowanie działa w połączeniu z PHP, mówiąc „ Foo for PHP” zamiast nazywać go „PHP Foo” lub „phpfoo”.

To ograniczenie używania "PHP" sprawia, że ​​licencja PHP jest niekompatybilna z Powszechną Licencją Publiczną (GPL), podczas gdy Licencja Zend jest niekompatybilna z powodu klauzuli reklamowej podobnej do oryginalnej licencji BSD .

Rozwój i społeczność

PHP zawiera różne darmowe i otwarte biblioteki w swojej dystrybucji źródłowej lub używa ich w powstałych kompilacjach binarnych PHP. PHP jest zasadniczo Internet -aware system z wbudowanymi modułami dostępu File Transfer Protocol (FTP) serwerów i wielu serwerów baz danych, w tym PostgreSQL , MySQL , Microsoft SQL Server i SQLite (która jest wbudowana baza danych), LDAP, serwerów i innych . Liczne funkcje znane programistom C, takie jak te z rodziny stdio , są dostępne w standardowych kompilacjach PHP.

PHP pozwala programistom na pisanie rozszerzeń w C w celu dodania funkcjonalności do języka PHP. Rozszerzenia PHP mogą być kompilowane statycznie do PHP lub ładowane dynamicznie w czasie wykonywania. Napisano wiele rozszerzeń, aby dodać obsługę Windows API , zarządzanie procesami w systemach operacyjnych podobnych do Uniksa , ciągi wielobajtowe ( Unicode ) , cURL i kilka popularnych formatów kompresji . Inne funkcje PHP udostępniane przez rozszerzenia obejmują integrację z IRC , dynamiczne generowanie obrazów i treści Adobe Flash , obiekty danych PHP (PDO) jako warstwę abstrakcji używaną do uzyskiwania dostępu do baz danych, a nawet syntezę mowy . Niektóre z podstawowych funkcji języka, takie jak te dotyczące łańcuchów i tablic, są również implementowane jako rozszerzenia. Projekt PHP Extension Community Library (PECL) jest repozytorium rozszerzeń języka PHP.

Niektóre inne projekty, takie jak Zephir , umożliwiają tworzenie rozszerzeń PHP w języku wysokiego poziomu i kompilowanie ich w natywne rozszerzenia PHP. Takie podejście, zamiast pisać rozszerzenia PHP bezpośrednio w C, upraszcza tworzenie rozszerzeń i skraca czas potrzebny na programowanie i testowanie.

Do grudnia 2018 roku Grupa PHP składała się z dziesięciu osób: Thies C. Arntzen , Stig Bakken , Shane Caraveo , Andi Gutmans , Rasmus Lerdorf , Sam Ruby , Sascha Schumann , Zeev Suraski , Jim Winstead i Andrei Zmievski .

Zend Technologies zapewnia programistom certyfikat PHP oparty na egzaminie PHP 7 (a wcześniej oparty na PHP 5.5), aby mogli zostać certyfikowanymi programistami PHP.

Instalacja i konfiguracja

Przykładowe wyjście funkcji phpinfo() w PHP 7.1

Istnieją dwa główne sposoby dodania obsługi PHP do serwera WWW – jako natywny moduł serwera WWW lub jako plik wykonywalny CGI. PHP ma bezpośredni interfejs modułu o nazwie Server Application Programming Interface (SAPI), który jest obsługiwany przez wiele serwerów WWW, w tym Apache HTTP Server , Microsoft IIS , Netscape (obecnie nieistniejący) i iPlanet . Niektóre inne serwery WWW, takie jak OmniHTTPd, obsługują interfejs ISAPI ( Internet Server Application Programming Interface ), który jest interfejsem modułu serwera WWW firmy Microsoft . Jeśli PHP nie obsługuje modułów serwera WWW, zawsze może być używany jako interfejs Common Gateway Interface (CGI) lub procesor FastCGI ; w takim przypadku serwer WWW jest skonfigurowany do używania pliku wykonywalnego CGI PHP do przetwarzania wszystkich żądań do plików PHP.

PHP-FPM (FastCGI Process Manager) to alternatywna implementacja FastCGI dla PHP, dołączona do oficjalnej dystrybucji PHP od wersji 5.3.3. W porównaniu ze starszą implementacją FastCGI zawiera kilka dodatkowych funkcji, przydatnych głównie w przypadku mocno obciążonych serwerów internetowych.

Używając PHP do skryptów wiersza poleceń, potrzebny jest plik wykonywalny interfejsu wiersza poleceń PHP (CLI). PHP obsługuje interfejs programowania aplikacji serwera CLI (SAPI) od PHP 4.3.0. Głównym celem tego SAPI jest tworzenie aplikacji powłoki przy użyciu PHP. Istnieje wiele różnic między interfejsem CLI SAPI a innymi interfejsami SAPI, chociaż mają one wiele takich samych zachowań.

PHP ma bezpośredni interfejs modułu o nazwie SAPI dla różnych serwerów WWW; w przypadku PHP 5 i Apache 2.0 na Windows jest to plik DLL o nazwie php5apache2.dll , który jest modułem, który m.in. zapewnia interfejs między PHP a serwerem WWW, zaimplementowany w postaci, która serwer rozumie. Ten formularz jest znany jako SAPI.

Istnieją różne rodzaje interfejsów SAPI dla różnych rozszerzeń serwera WWW. Na przykład, oprócz wymienionych powyżej, inne interfejsy SAPI dla języka PHP obejmują interfejs Common Gateway Interface (CGI) i interfejs wiersza poleceń (CLI).

PHP może być również używany do pisania aplikacji z graficznym interfejsem użytkownika (GUI) za pomocą rozszerzenia PHP-GTK . PHP-GTK nie jest zawarte w oficjalnej dystrybucji PHP, a jako rozszerzenie może być używane tylko z wersjami PHP 5.1.0 i nowszymi. Najpopularniejszym sposobem instalacji PHP-GTK jest kompilacja z kodu źródłowego.

Gdy PHP jest zainstalowane i używane w środowiskach chmurowych , dostarczane są zestawy programistyczne (SDK) do korzystania z funkcji specyficznych dla chmury. Na przykład:

Obsługiwanych jest wiele opcji konfiguracyjnych, mających wpływ zarówno na podstawowe funkcje PHP, jak i rozszerzenia. Plik konfiguracyjny php.inijest wyszukiwany w różnych lokalizacjach, w zależności od sposobu użycia PHP. Plik konfiguracyjny jest podzielony na różne sekcje, a niektóre opcje konfiguracyjne można również ustawić w konfiguracji serwera WWW.

Posługiwać się

Szeroki przegląd pakietu oprogramowania LAMP, wyświetlany tutaj wraz z Squid

PHP jest językiem skryptowym ogólnego przeznaczenia, który jest szczególnie odpowiedni do tworzenia stron WWW po stronie serwera , w którym to przypadku PHP zwykle działa na serwerze WWW . Każdy kod PHP w żądanym pliku jest wykonywany przez środowisko wykonawcze PHP, zwykle w celu utworzenia dynamicznej zawartości strony internetowej lub dynamicznych obrazów używanych na stronach internetowych lub w innych miejscach. Może być również używany do tworzenia skryptów wiersza poleceń i aplikacji z graficznym interfejsem użytkownika (GUI) po stronie klienta . PHP może być wdrażany na większości serwerów WWW, wielu systemach operacyjnych i platformach oraz może być używany z wieloma relacyjnymi systemami zarządzania bazami danych (RDBMS). Większość dostawców usług hostingowych obsługuje PHP do użytku przez swoich klientów. Jest on dostępny bezpłatnie, a Grupa PHP dostarcza kompletny kod źródłowy, który użytkownicy mogą tworzyć, dostosowywać i rozszerzać na własny użytek.

Dynamiczna strona internetowa: przykład skryptowania po stronie serwera (PHP i MySQL)

Pierwotnie zaprojektowany do tworzenia dynamicznych stron WWW , PHP skupia się teraz głównie na skryptów po stronie serwera , a to jest podobna do innych języków skryptowych po stronie serwera, które zapewniają dynamiczne treści z serwera WWW do klienta , takich jak Microsoft „s ASP.NET , Sun Microsystems ' JavaServer Pages i mod_perl. PHP przyciągnęło również rozwój wielu frameworków programowych, które zapewniają bloki konstrukcyjne i strukturę projektową, aby promować szybkie tworzenie aplikacji (RAD). Niektóre z nich to PRADO , CakePHP , Symfony , CodeIgniter , Laravel , Yii Framework , Phalcon i Laminas , oferujące funkcje podobne do innych frameworków internetowych .

Architektura LAMP stał się popularny w branży internetowej jako sposób wdrażania aplikacji internetowych. PHP jest powszechnie używane jako P w tym pakiecie obok Linuksa , Apache i MySQL , chociaż P może również odnosić się do Pythona , Perla lub kombinacji tych trzech. Podobne pakiety, WAMP i MAMP , są również dostępne dla systemów Windows i macOS , przy czym pierwsza litera oznacza odpowiedni system operacyjny. Chociaż zarówno PHP, jak i Apache są dostarczane jako część podstawowej instalacji macOS, użytkownicy tych pakietów szukają prostszego mechanizmu instalacji, który można łatwiej aktualizować.

W przypadku konkretnych i bardziej zaawansowanych scenariuszy użycia PHP oferuje dobrze zdefiniowany i udokumentowany sposób pisania niestandardowych rozszerzeń w C lub C++ . Poza rozszerzeniem samego języka w postaci dodatkowych bibliotek , rozszerzenia zapewniają sposób na poprawę szybkości wykonywania tam, gdzie jest to krytyczne i gdzie jest miejsce na ulepszenia poprzez użycie prawdziwie skompilowanego języka . PHP oferuje również dobrze zdefiniowane sposoby osadzania się w innych projektach oprogramowania. W ten sposób PHP można łatwo wykorzystać jako wewnętrzny język skryptowy dla innego projektu, zapewniając również ścisły interfejs z określonymi wewnętrznymi strukturami danych projektu .

PHP otrzymał mieszane recenzje ze względu na brak obsługi wielowątkowości na poziomie podstawowego języka, chociaż używanie wątków jest możliwe dzięki rozszerzeniu PECL "pthreads" .

Wyprodukowano interfejs wiersza poleceń, php-cli i dwa aparaty skryptowe ActiveX Windows Script Host dla PHP.

Statystyki popularności i użytkowania

PHP jest używany w systemach zarządzania treścią WWW, w tym MediaWiki , WordPress , Joomla , Drupal , Moodle , eZ Publish , eZ Platform i SilverStripe .

Strony internetowe używające PHP to Facebook , Digg , Dailymotion i Tumblr .

Według stanu na styczeń 2013 r. PHP było używane w ponad 240 milionach stron internetowych (39% badanych) i zostało zainstalowane na 2,1 miliona serwerów WWW .

Według stanu na marzec 2021 r. PHP był używany jako język programowania po stronie serwera na 79,1% stron internetowych, w porównaniu z 83,5% wcześniej, gdzie język można było określić, a PHP 7 jest najczęściej używaną wersją języka z 50,3% wszystkich witryny internetowe korzystają z tej wersji.

Bezpieczeństwo

W 2019 roku 11% wszystkich podatności wymienionych przez National Vulnerability Database było powiązanych z PHP; historycznie około 30% wszystkich luk wymienionych od 1996 roku w tej bazie danych jest powiązanych z PHP. Techniczne błędy bezpieczeństwa samego języka lub jego podstawowych bibliotek nie są częste (22 w 2009 r., około 1% całości, chociaż PHP dotyczy około 20% wymienionych programów). Uznając, że programiści popełniają błędy, niektóre języki obejmują sprawdzanie skażenia, aby automatycznie wykryć brak walidacji danych wejściowych, co powoduje wiele problemów. Taka funkcja jest opracowywana dla PHP, ale jej włączenie do wydania zostało kilkakrotnie odrzucone w przeszłości.

Istnieją zaawansowane łatki zabezpieczające takie jak Suhosin i utwardzania -patch, zaprojektowane specjalnie dla środowisk hostingowych.

Historycznie stare wersje PHP miały pewne parametry konfiguracyjne i wartości domyślne dla takich ustawień środowiska wykonawczego, które powodowały, że niektóre aplikacje PHP były podatne na problemy z bezpieczeństwem. Wśród nich, magic_quotes_gpca register_globalsDyrektywy konfiguracyjne były najlepsze znane; ta ostatnia sprawiła, że ​​wszelkie parametry adresu URL stały się zmiennymi PHP, otwierając ścieżkę dla poważnych luk w zabezpieczeniach, umożliwiając atakującemu ustawienie wartości dowolnej niezainicjowanej zmiennej globalnej i ingerowanie w wykonanie skryptu PHP. Obsługa ustawień " magicznych cudzysłowów " i "rejestrów globalnych" została wycofana od PHP 5.3.0 i usunięta z PHP 5.4.0.

Innym przykładem potencjalnej luki w ustawieniach środowiska wykonawczego jest niemożność wyłączenia wykonywania PHP (na przykład za pomocą enginedyrektywy konfiguracyjnej) dla katalogu, w którym przechowywane są przesłane pliki; włączenie go może spowodować wykonanie złośliwego kodu osadzonego w przesłanych plikach. Najlepszą praktyką jest albo zlokalizowanie katalogu obrazów poza głównym katalogiem dokumentu dostępnego dla serwera WWW i udostępnienie go za pomocą skryptu pośredniczącego, albo wyłączenie wykonywania PHP dla katalogu, w którym przechowywane są przesłane pliki.

Ponadto umożliwienie dynamicznego ładowania rozszerzeń PHP (poprzez enable_dldyrektywę konfiguracyjną) we współdzielonym środowisku hostingowym może prowadzić do problemów z bezpieczeństwem.

Domniemane konwersje typów, które powodują, że różne wartości są traktowane jako równe, czasami wbrew intencjom programisty, mogą prowadzić do problemów z bezpieczeństwem. Na przykład wynikiem porównania '0e1234' == '0'jest true, ponieważ ciągi, które można analizować jako liczby, są konwertowane na liczby; w tym przypadku pierwsza porównywana wartość jest traktowana jako notacja naukowa o wartości (0 × 10 1234 ), czyli zero. Takie błędy powodowały luki w uwierzytelnianiu w Simple Machines Forum , Typo3 i phpBB przy porównywaniu skrótów haseł MD5 . Zalecanym sposobem jest użycie hash_equals() (dla bezpieczeństwa ataków czasowych ) lub operatora tożsamości ( ), co daje wynik w . strcmp==='0e1234' === '0'false

W 2013 roku analizy ponad 170.000 defacements stron internetowych , opublikowanych przez Strefa-H , najczęściej (53%) stosowaną techniką było wykorzystywanie luki dołączania plików , głównie związane z niepewnego użycia konstrukcji języka PHP include, requireoraz allow_url_fopen.

Według stanu na kwiecień 2021 r. W3Techs informuje, że 64% witryn korzystających z PHP korzysta z wersji 7.2 lub starszej (które niejuż obsługiwane przez zespół programistów PHP), a 35% wszystkich witryn PHP korzystających z wersji 5.6 lub starszej.

Wersja 5 jest nadal używana przez 24,5% wszystkich serwisów (wrzesień 2021). Zdecydowanie zaleca się migrację do PHP w wersji 7 lub 8 i użycie random_int() zamiast rand() lub mt_rand(). Istnieją dwa ataki, które można przeprowadzić na źródłach entropii PHP: "Seed Attack" i "State recovery attack". Przy obecnych technologiach GPU atakujący może wykonać do 2^30 obliczeń MD5 na sekundę przy użyciu procesora GPU o wartości 250 USD, podczas gdy przy dodatkowych 500 USD może osiągnąć do 2^32 obliczeń. W połączeniu z „ Atak urodzinowy ” może to prowadzić do poważnych luk w zabezpieczeniach.

Zobacz też

Bibliografia

Dalsza lektura

Posłuchaj tego artykułu ( 35 minut )
Mówiona ikona Wikipedii
Ten plik audio został utworzony na podstawie rewizji tego artykułu z dnia 23 listopada 2011 r. i nie odzwierciedla kolejnych edycji. ( 23.11.2011 )

Zewnętrzne linki