PHP - PHP

PHP
PHP-logo.svg
Paradigmă Multi-paradigmă : imperativă , funcțională , orientată spre obiect , procedurală , reflexivă
Proiectat de Rasmus Lerdorf
Dezvoltator Echipa de dezvoltare PHP, Zend Technologies
A apărut prima dată 8 iunie 1995 ; Acum 26 de ani ( 08.06.1995 )
Versiune stabila
8.0.11  Editați acest lucru pe Wikidata / 23 septembrie 2021 ; Acum 24 de zile ( 23 septembrie 2021 )
Previzualizare lansare
8.1.0 Beta 1/22  Editați acest lucru pe Wikidata iulie 2021 ; 2 luni în urmă ( 22 iulie 2021 )
Disciplina de tastare Dinamic , slab

de la versiunea 7.0:

Treptat
Limbajul de implementare C (în primul rând; unele componente C ++ )
OS Unix-like , Windows , macOS , IBM i , OpenVMS
Licență Licență PHP (majoritatea motorului Zend sub licența Zend Engine )
Extensii de nume de fișier .php, .phar, .phtml, .pht,.phps
Site-ul web www .php .net Editați acest lucru la Wikidata
Implementări majore
Zend Engine , HHVM , PeachPie , Quercus , Parrot
Influențată de
Perl , HTML , C , C ++ , Java , Tcl , JavaScript , Hack
Influențat
Hack , JSP , ASP

PHP este un limbaj de scriptare de uz general orientat spre dezvoltarea web . A fost inițial creat de programatorul danez-canadian Rasmus Lerdorf în 1994. Implementarea de referință PHP este acum produsă de The PHP Group. PHP a reprezentat inițial Personal Home Page , dar acum reprezintă inițialismul recursiv PHP: Hypertext Preprocessor .

Codul PHP este de obicei procesat pe un server web de un interpret PHP implementat ca un modul , un daemon sau ca un executabil Common Gateway Interface (CGI). Pe un server web, rezultatul codului PHP interpretat și executat - care poate fi orice tip de date, cum ar fi HTML generat sau date de imagine binare - ar forma întregul sau o parte a unui răspuns HTTP . Există diferite sisteme de șabloane web , sisteme de gestionare a conținutului web și cadre web care pot fi utilizate pentru a orchestra sau a facilita generarea acelui răspuns. În plus, PHP poate fi utilizat pentru multe activități de programare în afara contextului web, cum ar fi aplicațiile grafice independente și controlul robotului cu drone . Codul PHP poate fi, de asemenea, executat direct din linia de comandă .

Interpretorul standard PHP, alimentat de Zend Engine , este un software gratuit lansat sub licența PHP . PHP a fost portat pe scară largă și poate fi implementat pe majoritatea serverelor web pe o varietate de sisteme de operare și platforme .

Limbajul PHP a evoluat fără o specificație formală scrisă sau un standard până în 2014, implementarea originală acționând ca standardul de facto pe care alte implementări au urmărit să îl urmeze. Din 2014, s-a lucrat la crearea unei specificații PHP formale.

W3Techs raportează că, începând cu aprilie 2021, „PHP este utilizat de 79,2% din toate site-urile al căror limbaj de programare de pe server îl cunoaștem”.

Istorie

Istoria timpurie

Rasmus Lerdorf , care a scris componenta originală Common Gateway Interface (CGI), împreună cu Andi Gutmans și Zeev Suraski , care au rescris analizorul care a format PHP 3.

Dezvoltarea PHP a început în 1994, când Rasmus Lerdorf a scris mai multe programe Common Gateway Interface (CGI) în C , pe care le-a folosit pentru a-și menține pagina personală . El le-a extins să lucreze cu formulare web și să comunice cu baze de date și a numit această implementare „Personal Home Page / Forms Interpreter” sau PHP / FI.

PHP / FI ar putea fi folosit pentru a construi aplicații web simple și dinamice . Pentru a accelera raportarea erorilor și a îmbunătăți codul, Lerdorf a anunțat inițial lansarea PHP / FI ca „Personal Home Page Tools (PHP Tools) versiunea 1.0” pe grupul de discuții Usenet comp.infosystems.www.authoring.cgi pe 8 iunie 1995 Această versiune avea deja funcționalitatea de bază pe care PHP o are astăzi. Aceasta a inclus variabile de tip Perl , gestionarea formularelor și capacitatea de a încorpora HTML . Sintaxa semăna cu cea a Perl , dar a fost mai simplu, mai limitat și mai puțin consistente.

Un exemplu de sintaxă PHP timpurie :

<!--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-->

PHP timpuriu nu a fost destinat să fie un nou limbaj de programare și a crescut organic, Lerdorf observând retrospectiv: „Nu știu cum să-l opresc, nu a existat niciodată intenția de a scrie un limbaj de programare [...] absolut nici o idee despre cum să scriu un limbaj de programare, am continuat să adaug următorul pas logic pe drum. " O echipă de dezvoltare a început să se formeze și, după luni de muncă și teste beta , a lansat oficial PHP / FI 2 în noiembrie 1997.

Faptul că PHP nu a fost conceput inițial, ci a fost dezvoltat organic a dus la denumirea inconsecventă a funcțiilor și la ordonarea inconsecventă a parametrilor acestora. În unele cazuri, numele funcțiilor au fost alese pentru a se potrivi cu bibliotecile de nivel inferior pe care PHP le „înfășura”, în timp ce în unele versiuni foarte timpurii ale PHP lungimea numelor funcției a fost utilizată intern ca funcție hash , astfel încât numele au fost alese pentru îmbunătăți distribuția valorilor hash .

PHP 3 și 4

Acesta este un exemplu de cod PHP personalizat pentru sistemul de gestionare a conținutului WordPress .

Zeev Suraski și Andi Gutmans au rescris analizorul în 1997 și au format baza PHP 3, schimbând numele limbii în acronimul recursiv PHP: Hypertext Preprocessor . Ulterior, au început testarea publică a PHP 3, iar lansarea oficială a avut loc în iunie 1998. Suraski și Gutmans au început apoi o nouă rescriere a nucleului PHP, producând Zend Engine în 1999. De asemenea, au fondat Zend Technologies în Ramat Gan , Israel .

Pe 22 mai 2000, a fost lansat PHP 4, alimentat de Zend Engine 1.0. Până în august 2008, această ramură a ajuns la versiunea 4.4.9. PHP 4 nu mai este în curs de dezvoltare și nici nu sunt planificate lansări de actualizări de securitate.

PHP 5

La 1 iulie 2004, a fost lansat PHP 5, propulsat de noul Zend Engine II. PHP 5 a inclus noi caracteristici precum suport îmbunătățit pentru programarea orientată pe obiecte, extensia PHP Data Objects (PDO) (care definește o interfață ușoară și consistentă pentru accesarea bazelor de date) și numeroase îmbunătățiri ale performanței. În 2008, PHP 5 a devenit singura versiune stabilă în curs de dezvoltare. Legarea statică târzie lipsise din versiunile anterioare de PHP și a fost adăugată în versiunea 5.3.

Multe proiecte open-source de profil înalt au încetat să accepte PHP 4 în noul cod din 5 februarie 2008, din cauza inițiativei GoPHP5, oferită de un consorțiu de dezvoltatori PHP care promovează tranziția de la PHP 4 la PHP 5.

De-a lungul timpului, interpreții PHP au devenit disponibili pe majoritatea sistemelor de operare existente pe 32 de biți și pe 64 de biți , fie prin construirea lor din codul sursă PHP, fie prin utilizarea unor binare pre-construite. Pentru versiunile PHP 5.3 și 5.4, singurele distribuții binare disponibile pentru Microsoft Windows erau versiunile IA-32 pe 32 de biți , necesitând modul de compatibilitate Windows pe 32 de biți în timp ce utilizați Internet Information Services (IIS) pe o platformă Windows pe 64 de biți. Versiunea PHP 5.5 a făcut versiunile 64-bit x86-64 disponibile pentru Microsoft Windows.

Suportul oficial de securitate pentru PHP 5.6 s-a încheiat la 31 decembrie 2018.

PHP 6 și Unicode

PHP a primit recenzii mixte din cauza lipsei suportului nativ Unicode la nivelul limbii de bază. În 2005, a fost inițiat un proiect condus de Andrei Zmievski pentru a aduce suport Unicode nativ în PHP, încorporând biblioteca International Components for Unicode (ICU) și reprezentând șiruri de text ca UTF-16 intern. Deoarece acest lucru ar provoca modificări majore atât la nivelul intern al limbii, cât și la codul de utilizator, a fost planificată lansarea acestuia ca versiunea 6.0 a limbii, împreună cu alte caracteristici majore în curs de dezvoltare.

Cu toate acestea, o lipsă de dezvoltatori care a înțeles schimbările necesare și problemele de performanță care decurg din conversia în și din UTF-16, care este rar utilizată într-un context web, au dus la întârzieri în proiect. Ca urmare, o versiune PHP 5.3 a fost creată în 2009, cu multe caracteristici non-Unicode portate înapoi din PHP 6, în special spații de nume. În martie 2010, proiectul în forma sa actuală a fost abandonat oficial și a fost pregătită o versiune PHP 5.4 care conține majoritatea caracteristicilor rămase non-Unicode din PHP 6, cum ar fi trăsăturile și re-legarea închiderii. Speranțele inițiale erau că se va forma un nou plan pentru integrarea Unicode, dar până în 2014 niciunul nu fusese adoptat.

PHP 7

În perioada 2014 și 2015, a fost dezvoltată o nouă versiune majoră PHP, PHP 7. Numerotarea acestei versiuni a implicat unele dezbateri între dezvoltatorii interni. În timp ce experimentul PHP 6 Unicode nu a fost lansat niciodată, mai multe articole și titluri de cărți au făcut referire la numele PHP 6, ceea ce ar fi putut provoca confuzie dacă o nouă versiune ar refolosi numele. După vot, a fost ales numele PHP 7.

Fundația PHP 7 este o ramură PHP care a fost inițial numită PHP următoarea generație ( phpng ). A fost scris de Dmitry Stogov, Xinchen Hui și Nikita Popov și a avut ca scop optimizarea performanței PHP prin refactoria Zend Engine, păstrând în același timp compatibilitatea limbajului aproape completă. Până la 14 iulie 2014, criteriile de referință bazate pe WordPress , care au servit ca principală suită de referință pentru proiectul phpng, au prezentat o creștere de aproape 100% a performanței. Modificările de la phpng facilitează îmbunătățirea performanței în versiunile viitoare, deoarece structurile de date mai compacte și alte modificări sunt considerate mai potrivite pentru o migrare de succes către un compilator just-in-time (JIT). Datorită schimbărilor semnificative, Zend Engine reprelucrat a fost numit Zend Engine 3 , urmând Zend Engine 2 folosit în PHP 5.

Datorită modificărilor interne majore din phpng, acesta trebuie să primească un nou număr de versiune majoră a PHP, mai degrabă decât o versiune minoră PHP 5, conform procesului de lansare PHP. Versiunilor majore ale PHP li se permite să rupă compatibilitatea înapoi a codului și, prin urmare, PHP 7 a oferit o oportunitate pentru alte îmbunătățiri dincolo de phpng care necesită pauze de compatibilitate înapoi. În special, a implicat următoarele modificări:

  • Multe mecanisme de eroare PHP la nivel fatal sau recuperabil au fost înlocuite cu excepții moderne orientate obiect .
  • Sintaxa pentru dereferencing variabilă a fost remodelate să fie pe plan intern mai coerente și complete, care să permită utilizarea operatorilor ->, [], (), {}, și ::, cu expresii semnificative arbitrare din partea stângă.
  • Suportul pentru metodele vechi de construcție în stil PHP 4 a fost depreciat.
  • Comportamentul foreachdeclarației a fost schimbat pentru a fi mai previzibil.
  • Constructorii pentru puținele clase încorporate în PHP care au revenit nul la eșec au fost schimbați pentru a arunca o excepție în schimb, pentru consistență.
  • Câteva interfețe de programare a aplicațiilor de server (SAPI) și menținute sau depreciate au fost eliminate din nucleul PHP, în special mysqlextensia veche .
  • Comportamentul list()operatorului a fost schimbat pentru a elimina suportul pentru șiruri.
  • Suportul a fost eliminat pentru delimitatori în stil ASP vechi <%și %>și <script language="php"> ... </script>.
  • A fost remediată o supraveghere care permite unei instrucțiuni de schimbare să aibă mai multe defaultclauze.
  • Suportul pentru suportul numărului hexazecimal în unele conversii implicite de la șiruri la tipuri de numere a fost eliminat.
  • Operatorii de schimbare la stânga și la dreapta au fost schimbați pentru a se comporta mai consecvent între platforme.
  • Conversiile între numerele în virgulă mobilă și numere întregi au fost modificate (de exemplu, infinitul schimbat pentru a se converti la zero) și implementate mai consecvent pe platforme.

PHP 7 a inclus și noi caracteristici de limbaj. În special, a introdus declarații de tip return pentru funcții care completează declarațiile de tip de parametru existente și suport pentru tipurile scalare (întreg, float, șir și boolean) în declarațiile de tip de parametru și return.

PHP 8

PHP 8 a fost lansat pe 26 noiembrie 2020. PHP 8 este o versiune majoră și are modificări noi față de versiunile anterioare. Funcțiile noi și modificările notabile includ:

Compilație just-in-time

Compilarea just-in-time este acceptată în PHP 8.

Compilatorul JIT al PHP 8 poate oferi îmbunătățiri substanțiale ale performanței pentru unele cazuri de utilizare. Dezvoltatorul PHP Nikita Popov a declarat că îmbunătățirile de performanță pentru majoritatea site-urilor web vor fi mai puțin substanțiale decât actualizarea de la PHP 5 la PHP 7. Se așteaptă ca îmbunătățirile de performanță datorate adăugării compilatorului JIT să fie mai substanțiale pentru operațiunile de tip matematic decât pentru cazuri de utilizare comune pentru dezvoltarea web. În plus, compilatorul JIT oferă potențialul viitor de a muta un cod din C în PHP, datorită îmbunătățirilor de performanță pentru unele cazuri de utilizare.

Adăugarea expresiei de potrivire

PHP 8 a introdus matchexpresia. Expresia de potrivire este similară conceptual cu o switchafirmație și este mai compactă pentru unele cazuri de utilizare. Deoarece matcheste o expresie, rezultatul acesteia poate fi prins într-o variabilă sau returnat dintr-o funcție.

Tastați modificările și completările

PHP 8 a introdus tipuri de uniune, un nou statictip de returnare și un nou mixedtip.

„Atribute”, denumite adesea „adnotări” în alte limbaje de programare, au fost adăugate în PHP 8, care permit adăugarea metadatelor la clase.

throwa fost schimbat de la a fi o afirmație la a fi o expresie. Acest lucru permite aruncarea excepțiilor în locuri care nu erau posibile anterior.

Modificări și adăugiri de sintaxă

PHP 8 include modificări pentru a permite sintaxe alternative, mai concise sau mai consistente într-un număr de scenarii. De exemplu, operatorul nullsafe este similar cu operatorul null coalescing ?? , dar este utilizat la apelarea metodelor. Următorul fragment de cod nu va genera o eroare dacă getBirthday()returnează nul:

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

Promovarea proprietății constructorului a fost adăugată ca „ zahăr sintactic ” , permițând setarea automată a proprietăților clasei atunci când parametrii sunt trecuți într-un constructor de clase . Acest lucru reduce cantitatea de cod a cazanului care trebuie scris.

Alte modificări minore includ suport pentru utilizarea ::classobiectelor, care servește ca alternativă pentru utilizarea get_class(); capturi care nu captează în blocuri try-catch; modificări ale sintaxei variabile pentru rezolvarea neconcordanțelor; suport pentru argumente numite; și suport pentru virgulele finale în listele de parametri, care adaugă consistență cu suportul pentru virgulele finale în alte contexte, cum ar fi în matrice.

Modificări și completări standard ale bibliotecii

  • Hărți slabe au fost adăugate în PHP 8. A WeakMapconține referințe la obiecte, dar aceste referințe nu împiedică astfel de obiecte să fie colectate gunoi . Acest lucru poate oferi îmbunătățiri de performanță în scenarii în care datele sunt stocate în cache ; acest lucru este deosebit de relevant pentru ORM-uri .
  • Diverse ajustări ale interfețelor, cum ar fi adăugarea de suport pentru crearea DateTimeobiectelor din interfețe și adăugarea unei Stringableinterfețe care poate fi utilizată pentru sugestii de tip.
  • Diverse funcții noi, inclusiv str_contains (), str_starts_with () și str_ends_with (); fdiv (); get_debug_type (); și get_resource_id ()
  • Implementarea obiectelor token_get_all ()

Modificări suplimentare

  • Adnotările de tip au fost adăugate și în codul sursă C PHP pentru a permite funcțiilor și metodelor interne să aibă „informații complete de tip în reflecție”.
  • Moștenirea cu metode private
  • Metode abstracte în îmbunătățiri ale trăsăturilor

Istoricul lansărilor

Versiune Data de lansare Suportat până la Note
Versiune veche, care nu mai este menținută: 1.0 8 iunie 1995 Denumit oficial „Instrumente personale pentru pagina de pornire (Instrumente PHP)”. Aceasta este prima utilizare a numelui „PHP”.
Versiune veche, care nu mai este menținută: 2.0 1 noiembrie 1997 Denumit oficial „PHP / FI 2.0”. Aceasta este prima versiune care ar putea fi de fapt caracterizată ca PHP, fiind un limbaj independent cu multe caracteristici care au rezistat până în prezent.
Versiune veche, care nu mai este menținută: 3.0 6 iunie 1998 20 octombrie 2000 Dezvoltarea se mută de la o persoană la mai mulți dezvoltatori. Zeev Suraski și Andi Gutmans rescriu baza acestei versiuni.
Versiune veche, care nu mai este menținută: 4.0 22 mai 2000 23 iunie 2001 S-a adăugat un sistem mai avansat de analiză / executare în două etape, numit motor Zend.
Versiune veche, care nu mai este menținută: 4.1 10 decembrie 2001 12 martie 2002 Introdus "superglobals" ( $_GET, $_POST, $_SESSIONetc.)
Versiune veche, care nu mai este menținută: 4.2 22 aprilie 2002 6 septembrie 2002 Dezactivat register_globalsîn mod implicit. Datele primite prin rețea nu mai sunt inserate direct în spațiul de nume global , închizând posibile găuri de securitate din aplicații.
Versiune veche, care nu mai este menținută: 4.3 27 decembrie 2002 31 martie 2005 A introdus interfața liniei de comandă (CLI), pentru a completa CGI.
Versiune veche, care nu mai este menținută: 4.4 11 iulie 2005 7 august 2008 S-a remediat o eroare de corupție a memoriei, care necesită ruperea compatibilității binare cu extensiile compilate în versiunea PHP 4.3.x.
Versiune veche, care nu mai este menținută: 5.0 13 iulie 2004 5 septembrie 2005 Zend Engine II cu un nou model de obiecte.
Versiune veche, care nu mai este menținută: 5.1 24 noiembrie 2005 24 august 2006 Îmbunătățiri de performanță cu introducerea variabilelor de compilare în PHP Engine re-proiectat. S-au adăugat obiecte de date PHP (PDO) ca o interfață consistentă pentru accesarea bazelor de date.
Versiune veche, care nu mai este menținută: 5.2 2 noiembrie 2006 6 ianuarie 2011 Activat extensia filtrului în mod implicit. Suport nativ JSON .
Versiune veche, care nu mai este menținută: 5.3 30 iunie 2009 14 august 2014 Suport spațiu de nume ; legăturile târziu statice , eticheta de salt (limitat Goto ), funcții anonime , închizători , arhive PHP (PHAR), de colectare a gunoiului pentru referințe circulare, îmbunătățite pentru Windows sprijin, SQLite3, mysqlnd ca un înlocuitor pentru libmysql ca suport bibliotecă pentru extensiile de lucru cu MySQL , fileinfo ca înlocuitor pentru mime_magic pentru un suport MIME mai bun , extensia de internaționalizare și deprecierea extensiei ereg.
Versiune veche, care nu mai este menținută: 5.4 1 martie 2012 3 septembrie 2015 Suport pentru trăsături , suport pentru sintaxă cu matrice scurte. Elemente eliminate: register_globals, safe_mode, allow_call_time_pass_reference, , și . Server web încorporat. Mai multe îmbunătățiri ale caracteristicilor existente, performanțe și cerințe de memorie reduse. session_register()session_unregister()session_is_registered()
Versiune veche, care nu mai este menținută: 5.5 20 iunie 2013 10 iulie 2016 Suport pentru generatoare , finallyblocuri pentru gestionarea excepțiilor, OpCache (bazat pe Zend Optimizer +) inclus în distribuția oficială.
Versiune veche, care nu mai este menținută: 5.6 28 august 2014 31 decembrie 2018 Expresii scalare constante, funcții variadice , despachetarea argumentelor, nou operator de exponențiere, extensii ale useinstrucțiunii pentru funcții și constante, nou phpdbgdepanator ca modul SAPI și alte îmbunătățiri mai mici.
6.x Nu a fost eliberat N / A Versiune abandonată a PHP care planifica să includă suport nativ Unicode.
Versiune veche, care nu mai este menținută: 7.0 3 decembrie 2015 10 ianuarie 2019 Zend Engine 3 (îmbunătățiri ale performanței și suport pentru 64 de biți întregi pe Windows), sintaxă variabilă uniformă, proces de compilare bazat pe AST , adăugat , consistență de deplasare pe biți între platforme, operator ( coaliție nulă ) operator, sintaxă de evacuare a punctului de cod Unicode , declarații de tip return, declarații de tip scalar (număr întreg, flotant, șir și boolean), operator de comparație în trei direcții „navă spațială” , delegare generatoare , clase anonime , API CSPRNG mai simplu și mai consistent disponibil , înlocuirea multor „erori” PHP rămase interne cu excepțiile mai moderne , și sintaxa de prescurtare pentru importul mai multor elemente dintr-un spațiu de nume. Closure::call()??<=>
Versiune veche, care nu mai este menținută: 7.1 1 decembrie 2016 1 decembrie 2019 tip return return , modificatori de vizibilitate constantă a clasei
Versiune veche, care nu mai este menținută: 7.2 30 noiembrie 2017 30 noiembrie 2020 Parametrul obiectului și declarația tipului de returnare, extensia Libsodium, suprascrierea metodei abstracte, lărgirea tipului de parametru
Versiune mai veche, dar încă menținută: 7.3 6 decembrie 2018 6 decembrie 2021 Sintaxa Heredoc și Nowdoc flexibilă , suport pentru atribuirea referințelor și deconstrucția matricei cu list (), suport PCRE2, funcție hrtime ()
Versiune mai veche, dar încă menținută: 7.4 28 noiembrie 2019 28 noiembrie 2022 Proprietăți tipizate 2.0, preîncărcare, operator de atribuire null-coalescing, îmbunătățire openssl_random_pseudo_bytes, Referințe slabe, FFI - interfață funcție străină , extensie hash disponibilă întotdeauna, registru hash parolă, împărțirea șirurilor multibyte, reflectare pentru referințe, separare ext / wddx, serializare obiect nou personalizat mecanism
Versiune stabilă curentă: 8.0 26 noiembrie 2020 26 noiembrie 2023 Compilație Just-In-Time (JIT) , matrici începând cu un indice negativ, semantică a limbajului mai strict / saner (validare pentru metode de trăsături abstracte), comparații de șiruri la număr saner, șiruri numerice saner, TypeError pe operatori aritmetici / bit-bit nevalizi, reclasificare a diverse erori ale motorului, erori de tip consistente pentru funcții interne, eroare fatală pentru semnăturile metodelor incompatibile), conversie float-șir independentă de localizare, modificări de sintaxă variabilă, atribute, argumente denumite, expresie de potrivire, promovare a proprietății constructorului, tipuri de uniuni, tip mixt, static tip return, operator nullsafe, capturi care nu capturează, expresie aruncare, extensia JSON este întotdeauna disponibilă.
Lansare viitoare: 8.1 25 noiembrie 2021 ?? Noiembrie 2024 Notare literală în număr întreg octal explicit, enumerări
Legendă:
Versiune veche
Versiune mai veche, încă menținută
Ultima versiune
Ultima versiune de previzualizare
Lansare viitoare

Începând cu 28 iunie 2011, echipa de dezvoltare PHP a implementat un calendar pentru lansarea de noi versiuni de PHP. În cadrul acestui sistem, cel puțin o versiune ar trebui să apară în fiecare lună. O dată pe an, ar trebui să apară o versiune minoră, care poate include funcții noi. Fiecare versiune minoră ar trebui să fie acceptată cel puțin doi ani cu corecții de securitate și erori, urmată de cel puțin un an de numai corecții de securitate, pentru un total de trei ani de proces de versiune pentru fiecare versiune minoră. Nicio funcție nouă, cu excepția cazului în care este mică și autonomă, nu trebuie introdusă într-o versiune minoră în timpul procesului de lansare de trei ani.

Mascotă

ElePHPant, mascota PHP

Mascota proiectului PHP este elePHPant , un elefant albastru cu logo-ul PHP pe lateral, proiectat de Vincent Pontier în 1998. „Literele (PHP) formau forma unui elefant dacă erau privite într-un unghi lateral”. ElePHPant este uneori colorat diferit atunci când este sub formă de jucărie de pluș .

Multe variante ale acestei mascote au fost făcute de-a lungul anilor. Doar elePHPants bazate pe designul original de Vincent Pontier sunt considerate oficiale de către comunitate. Acestea sunt de colecție și unele dintre ele sunt extrem de rare.

Sintaxă

O aplicație „Hello World” în PHP 7.4 care rulează pe un server de dezvoltare localhost

Următorul „Bună ziua, lume!” programul este scris în cod PHP încorporat într-un document HTML :

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

Cu toate acestea, deoarece nu există nicio cerință pentru ca codul PHP să fie încorporat în HTML, cea mai simplă versiune de Hello, World! poate fi scris astfel, cu eticheta de închidere omisă după cum se preferă în fișierele care conțin cod PHP pur ?>

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

Interpretorul PHP execută doar codul PHP în cadrul său delimitatori . Orice lucru în afara delimitatorilor săi nu este procesat de PHP, deși textul non-PHP este încă supus structurilor de control descrise în codul PHP. Cele mai comune delimitatori sunt <?phpdeschiderea și închiderea secțiunilor PHP. Există și forma scurtată . Acest scurt delimitator face ca fișierele script să fie mai puțin portabile, deoarece suportul pentru acestea poate fi dezactivat în configurația locală PHP și, prin urmare, este descurajat. În schimb, nu există nicio recomandare împotriva etichetei ecou scurt . Înainte de PHP 5.4.0, această scurtă sintaxă funcționează numai cu setarea de configurare activată, în timp ce pentru PHP 5.4.0 și versiunile ulterioare este întotdeauna disponibilă. Scopul tuturor acestor delimitatori este de a separa codul PHP de conținutul non-PHP, cum ar fi codul JavaScript sau marcajul HTML. Deci, cel mai scurt „Bună ziua, lume!” programul scris în PHP este: ?><?<?=echoshort_open_tag

<?='Hello, World!';

Prima formă de delimitatori <?phpși , în XHTML și alte documente XML , creează instrucțiuni de procesare XML formate corect. Aceasta înseamnă că amestecul rezultat de cod PHP și alte marcaje în fișierul de pe server este în sine XML bine format. ?>

Variabilele sunt prefixate cu un simbol în dolari , iar un tip nu trebuie specificat în prealabil. PHP 5 a introdus declarații de tip care permit funcțiilor să-și forțeze parametrii să fie obiecte ale unei clase specifice, tablouri, interfețe sau funcții de apel invers . Cu toate acestea, înainte de PHP 7, declarațiile de tip nu puteau fi folosite cu tipuri scalare precum întreg sau șir.

Mai jos este un exemplu de modul în care variabilele PHP sunt declarate și inițializate.

<?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
?>

Spre deosebire de numele funcțiilor și ale claselor, numele variabilelor sunt sensibile la majuscule și minuscule. Atât șirurile citate dublu („”), cât și șirurile heredoc oferă capacitatea de a interpola valoarea unei variabile în șir. PHP tratează liniile noi ca spații albe în modul unui limbaj de formă liberă , iar instrucțiunile sunt terminate printr-un punct și virgulă. PHP are trei tipuri de sintaxă a comentariilor : /* */blocuri de marcaje și comentarii în linie; //sau #sunt folosite pentru comentarii pe o singură linie. echoDeclarația este una din mai multe facilități PHP oferă textului de ieșire.

În ceea ce privește cuvintele cheie și sintaxa limbajului, PHP este similar cu sintaxa stilului C. ifcondițiile forși whilebuclele și returnările funcțiilor sunt similare în sintaxă cu limbaje precum C, C ++, C #, Java și Perl.

Tipuri de date

PHP este ușor de tastat . Se stochează numere întregi într - o gamă dependentă de platformă, fie ca 32, 64 sau 128 de biți semnat întreg echivalent cu tipul lung limbajul C . Numerele întregi nesemnate sunt convertite în valori semnate în anumite situații, ceea ce comportă diferit față de multe alte limbaje de programare. Variabilele întregi pot fi atribuite folosind notații zecimale (pozitive și negative), octale , hexazecimale și binare .

Numerele cu virgulă mobilă sunt, de asemenea, stocate într-un interval specific platformei. Ele pot fi specificate folosind notația în virgulă mobilă sau două forme de notație științifică . PHP are un tip nativ boolean care este similar cu tipurile native booleene din Java și C ++ . Folosind regulile de conversie de tip boolean, valorile diferite de zero sunt interpretate ca adevărate și zero ca false, ca în Perl și C ++.

Tipul de date nul reprezintă o variabilă care nu are valoare; NULLeste singura valoare permisă pentru acest tip de date.

Variabilele de tip „resursă” reprezintă referințe la resurse din surse externe. Acestea sunt de obicei create de funcții dintr-o anumită extensie și pot fi procesate numai de funcții din aceeași extensie; exemplele includ resurse de fișiere, imagini și baze de date.

Tablourile pot conține elemente de orice tip pe care PHP le poate gestiona, inclusiv resurse, obiecte și chiar alte tablouri. Ordinea este păstrată în liste de valori și în hash-uri cu chei și valori, iar cele două pot fi amestecate. PHP acceptă, de asemenea, șiruri , care pot fi utilizate cu ghilimele simple, ghilimele duble, sintaxa nowdoc sau heredoc .

PHP Biblioteca Standard (SPL) încearcă să rezolve problemele standard , și pune în aplicare interfețe eficiente de acces la date și clase.

Funcții

PHP definește o gamă largă de funcții în limbajul de bază și multe sunt disponibile și în diferite extensii; aceste funcții sunt bine documentate în documentația PHP online . Cu toate acestea, biblioteca încorporată are o mare varietate de convenții de denumire și inconsecvențe asociate, așa cum este descris în istoria de mai sus.

Funcțiile personalizate pot fi definite de dezvoltator:

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.';

În 2021, rezultatul eșantionului de mai sus este „Am în prezent 26 de ani”.

În locul indicatoarelor de funcții , funcțiile din PHP pot fi menționate printr-un șir care conține numele lor. În acest mod, funcțiile PHP normale pot fi utilizate, de exemplu, ca apeluri de apel sau în cadrul tabelelor de funcții . Funcțiile definite de utilizator pot fi create în orice moment fără a fi prototipate . Funcțiile pot fi definite în interiorul blocurilor de cod, permițând o decizie în timp de execuție cu privire la stabilirea sau nu a unei funcții. Există o function_existsfuncție care determină dacă o funcție cu un nume dat a fost deja definită. Apelurile de funcții trebuie să utilizeze paranteze, cu excepția funcțiilor de constructor de clasă zero-argument apelate cu operatorul PHP new, caz în care parantezele sunt opționale.

Până la PHP 5.3, suportul pentru funcții și închideri anonime nu exista în PHP. Deși create_function()există de la PHP 4.0.1, este doar o învelitoare subțire eval()care permite crearea funcțiilor normale PHP în timpul executării programului. PHP 5.3 a adăugat sintaxă pentru a defini o funcție anonimă sau „ închidere ” care poate capta variabile din domeniul înconjurător. Sintaxa săgeată stenogramă a fost adăugată în PHP 7.4:

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

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

În exemplul de mai sus, getAdder()funcția creează o închidere utilizând argumentul trecut $x(cuvântul cheie useimportă o variabilă din contextul lexical), care ia un argument suplimentar $yși returnează închiderea creată apelantului. O astfel de funcție este un obiect de primă clasă, ceea ce înseamnă că poate fi stocată într-o variabilă, transmisă ca parametru altor funcții etc.

În mod neobișnuit pentru un limbaj tastat dinamic, PHP acceptă declarații de tip pe parametrii funcției, care sunt aplicate în timpul rulării. Acest lucru a fost acceptat pentru clase și interfețe de la PHP 5.0, pentru tablouri de la PHP 5.1, pentru „apelabile” de la PHP 5.4 și tipuri scalare (întregi, flotante, șiruri și booleene) de la PHP 7.0. PHP 7.0 are, de asemenea, declarații de tip pentru tipurile de returnare a funcțiilor, exprimate prin plasarea numelui de tip după lista de parametri, precedată de două puncte. De exemplu, getAdderfuncția din exemplul anterior ar putea fi adnotată cu tipuri de genul în 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

În mod implicit, declarațiile de tip scalar respectă principiile slabe de tastare. Deci, de exemplu, dacă tipul unui parametru este int, PHP ar permite nu numai numere întregi, ci și șiruri numerice convertibile, flotante sau booleene să fie trecute la acea funcție și le-ar converti. Cu toate acestea, PHP 7 are un mod de „tastare strictă” care, atunci când este utilizat, interzice astfel de conversii pentru apeluri funcționale și revine într-un fișier.

Obiecte PHP

Funcționalitatea de bază de programare orientată obiect a fost adăugată în PHP 3 și îmbunătățită în PHP 4. Acest lucru a permis ca PHP să câștige mai multă abstracție, facilitând sarcinile creative pentru programatorii care folosesc limbajul. Manipularea obiectelor a fost complet rescrisă pentru PHP 5, extinzând setul de caracteristici și îmbunătățind performanța. În versiunile anterioare de PHP, obiectele erau tratate ca tipuri de valori . Dezavantajul acestei metode a fost acela că codul trebuia să utilizeze intens variabilele "de referință" ale PHP dacă dorea să modifice un obiect, acesta a fost trecut, mai degrabă decât să creeze o copie a acestuia. În noua abordare, obiectele sunt menționate prin mâner și nu prin valoare.

PHP 5 a introdus variabile și metode private și protejate , împreună cu clase abstracte , clase finale , metode abstracte și metode finale . De asemenea, a introdus un mod standard de declarare a constructorilor și distructorilor , similar cu cel al altor limbaje orientate obiect, cum ar fi C ++ , și un model standard de tratare a excepțiilor . În plus, PHP 5 a adăugat interfețe și a permis implementarea mai multor interfețe. Există interfețe speciale care permit obiectelor să interacționeze cu sistemul de rulare. Obiectele care implementează ArrayAccess pot fi utilizate cu sintaxa matricei și obiectele care implementează Iterator sau IteratorAggregate pot fi utilizate cu foreach construcția de limbaj . Nu există nicio caracteristică de tabel virtual în motor, deci variabilele statice sunt legate cu un nume în loc de o referință la momentul compilării.

Dacă dezvoltatorul creează o copie a unui obiect folosind cuvântul rezervat clone, motorul Zend va verifica dacă __clone()a fost definită o metodă. Dacă nu, va apela o valoare implicită __clone()care va copia proprietățile obiectului. Dacă __clone()este definită o metodă, atunci va fi responsabilă pentru setarea proprietăților necesare în obiectul creat. Pentru comoditate, motorul va furniza o funcție care importă proprietățile obiectului sursă, astfel încât programatorul să poată începe cu o replică secundară a obiectului sursă și să suprascrie doar proprietățile care trebuie schimbate.

Vizibilitatea proprietăților și metodelor PHP este definit folosind cuvinte cheie public , privateși protected. Valoarea implicită este publică, dacă se utilizează numai var ; vareste un sinonim pentru public. Articolele declarate publicpot fi accesate oriunde. protectedlimitează accesul la clasele moștenite (și la clasa care definește elementul). privatelimitează vizibilitatea doar la clasa care definește articolul. Obiectele de același tip au acces unul la celălalt membru privat și protejat, deși nu sunt aceeași instanță.

Exemplu

Următorul este un exemplu de bază de programare orientată obiect în 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

Implementări

Singura implementare completă a PHP este originalul, cunoscut pur și simplu ca PHP. Este cel mai utilizat și este alimentat de Zend Engine . Pentru a-l dezambigua de alte implementări, uneori se numește neoficial „Zend PHP”. Zend Engine compilează codul sursă PHP din mers într-un format intern pe care îl poate executa, astfel funcționează ca interpret . Este, de asemenea, „implementarea de referință” a PHP, deoarece PHP nu are nicio specificație formală, astfel încât semantica Zend PHP definește semantica PHP. Datorită semanticii complexe și nuanțate a PHP, definită de modul în care funcționează Zend, este dificil pentru implementările concurente să ofere compatibilitate completă.

Modelul de execuție single-request-per-script al PHP și faptul că Zend Engine este un interpret, duce la ineficiență; ca rezultat, au fost dezvoltate diverse produse pentru a ajuta la îmbunătățirea performanței PHP. Pentru a accelera timpul de execuție și a nu fi necesar să compilați codul sursă PHP de fiecare dată când pagina web este accesată, scripturile PHP pot fi, de asemenea, implementate în formatul intern al motorului PHP utilizând un cache opcode , care funcționează prin cache a formei compilate a un script PHP (coduri opționale ) în memoria partajată pentru a evita costurile de analiză și compilare a codului de fiecare dată când rulează scriptul. Un cache opcode, Zend Opcache , este încorporat în PHP de la versiunea 5.5. Un alt exemplu de cache opcode utilizat pe scară largă este cache-ul alternativ PHP (APC), care este disponibil ca extensie PECL .

În timp ce Zend PHP este încă cea mai populară implementare, au fost dezvoltate câteva alte implementări. Unele dintre acestea sunt compilatoare sau acceptă compilarea JIT și, prin urmare, oferă beneficii de performanță față de Zend PHP, în detrimentul lipsei compatibilității PHP complete. Implementările alternative includ următoarele:

  • HHVM (HipHop Virtual Machine) - dezvoltat pe Facebook și disponibil ca sursă deschisă, convertește codul PHP într-un bytecode la nivel înalt (cunoscut în mod obișnuit ca limbă intermediară ), care este apoi tradus în codul mașinii x86-64 dinamic în timpul rulării de către un compilator just-in-time (JIT), rezultând îmbunătățiri de până la 6 × performanțe. Cu toate acestea, de la versiunea 7.2 Zend a depășit HHVM, iar HHVM 3.24 este ultima versiune care acceptă oficial PHP.
  • Papagal  - o mașină virtuală concepută pentru a rula limbaje dinamice în mod eficient; Pipp transformă codul sursă PHP în reprezentarea intermediară Parrot , care este apoi tradusă în bytecode-ul Parrot și executată de mașina virtuală.
  • PeachPie - un compilator de a doua generație pentru. NET Common Intermediate Language (CIL) bytecode, construit pe platforma Roslyn ; succesorul lui Phalanger, împărtășind mai multe componente arhitecturale
  • Phalanger  - compilează PHP în bytecode de limbaj intermediar comun (CIL); predecesorul PeachPie
  • Quercus  - compilează PHP în bytecode Java
  • HipHop  - dezvoltat pe Facebook și disponibil ca open source, transformă scripturile PHP în cod C ++ și apoi compilează codul rezultat, reducând încărcarea serverului cu până la 50%. La începutul anului 2013, Facebook l-a depreciat în favoarea HHVM din mai multe motive, inclusiv dificultăți de implementare și lipsa de suport pentru întregul limbaj PHP, inclusiv versiunile create_function()și eval()construcțiile.

Licențierea

PHP este un software gratuit lansat sub licența PHP , care stipulează că:

Produsele derivate din acest software nu pot fi numite „PHP” și nici „PHP” nu pot apărea în numele lor, fără permisiunea scrisă prealabilă de la group@php.net. Puteți indica faptul că software-ul dvs. funcționează împreună cu PHP spunând „ Foo pentru PHP” în loc să îl numiți „PHP Foo” sau „phpfoo”.

Această restricție privind utilizarea „PHP” face ca licența PHP să fie incompatibilă cu licența publică generală (GPL), în timp ce licența Zend este incompatibilă datorită unei clauze publicitare similare cu cea a licenței BSD originale .

Dezvoltare și comunitate

PHP include diverse biblioteci gratuite și open-source în distribuția sursă sau le folosește în versiunile binare PHP rezultate. PHP este în esență un sistem informatic Internet cu module încorporate pentru accesarea serverelor Protocol de transfer de fișiere (FTP) și a mai multor servere de baze de date, inclusiv PostgreSQL , MySQL , Microsoft SQL Server și SQLite (care este o bază de date încorporată), servere LDAP și altele . Numeroase funcții familiare programatorilor C, precum cele din familia stdio , sunt disponibile în versiunile standard de PHP.

PHP permite dezvoltatorilor să scrie extensii în C pentru a adăuga funcționalitate limbajului PHP. Extensiile PHP pot fi compilate static în PHP sau încărcate dinamic în timpul rulării. Au fost scrise numeroase extensii pentru a adăuga suport pentru API-ul Windows , gestionarea proceselor pe sisteme de operare similare Unix , șiruri multibyte ( Unicode ), cURL și mai multe formate populare de compresie . Alte caracteristici PHP puse la dispoziție prin extensii includ integrarea cu IRC , generarea dinamică de imagini și conținut Adobe Flash , obiectele de date PHP (PDO) ca strat de abstractizare utilizat pentru accesarea bazelor de date și chiar sinteza vorbirii . Unele dintre funcțiile de bază ale limbajului, cum ar fi cele care se ocupă de șiruri și matrice, sunt de asemenea implementate ca extensii. Proiectul PHP Extension Community Library (PECL) este un depozit pentru extensii la limbajul PHP.

Alte proiecte, cum ar fi Zephir , oferă posibilitatea extensiilor PHP de a fi create într-un limbaj de nivel înalt și compilate în extensii PHP native. O astfel de abordare, în loc să scrie extensii PHP direct în C, simplifică dezvoltarea extensiilor și reduce timpul necesar pentru programare și testare.

Până în decembrie 2018, grupul PHP era format din zece persoane: Thies C. Arntzen , Stig Bakken , Shane Caraveo , Andi Gutmans , Rasmus Lerdorf , Sam Ruby , Sascha Schumann , Zeev Suraski , Jim Winstead și Andrei Zmievski .

Zend Technologies oferă o certificare PHP bazată pe examenul PHP 7 (și anterior bazat pe PHP 5.5) pentru ca programatorii să devină dezvoltatori PHP certificați.

Instalare și configurare

Exemplu de ieșire a funcției phpinfo () în PHP 7.1

Există două modalități principale de a adăuga suport pentru PHP la un server web - ca modul nativ de server web sau ca executabil CGI. PHP are o interfață de modul direct numită Server Application Programming Interface (SAPI), care este susținută de multe servere web, inclusiv Apache HTTP Server , Microsoft IIS , Netscape (acum defunct) și iPlanet . Unele alte servere web, cum ar fi OmniHTTPd, acceptă interfața de programare a aplicațiilor pentru serverul de internet (ISAPI), care este o interfață a modulului de server web Microsoft . Dacă PHP nu are suport pentru module pentru un server web, acesta poate fi întotdeauna folosit ca o interfață de gateway comună (CGI) sau procesor FastCGI ; în acest caz, serverul web este configurat pentru a utiliza executabilul CGI PHP pentru a procesa toate cererile către fișiere PHP.

PHP-FPM (FastCGI Process Manager) este o implementare alternativă FastCGI pentru PHP, inclusă în distribuția oficială PHP de la versiunea 5.3.3. În comparație cu implementarea FastCGI mai veche, aceasta conține câteva caracteristici suplimentare, utile în cea mai mare parte pentru serverele web încărcate puternic.

Când utilizați PHP pentru scriptarea pe linia de comandă, este necesar un executabil al interfeței de linie de comandă PHP (CLI). PHP acceptă o interfață de programare a aplicațiilor server CLI (SAPI) de la PHP 4.3.0. Accentul principal al acestui SAPI este dezvoltarea de aplicații shell folosind PHP. Există destul de multe diferențe între CLI SAPI și alte SAPI, deși împărtășesc multe dintre aceleași comportamente.

PHP are o interfață de modul direct numită SAPI pentru diferite servere web; în cazul PHP 5 și Apache 2.0 pe Windows, acesta este furnizat sub forma unui fișier DLL numit php5apache2.dll , care este un modul care, printre alte funcții, oferă o interfață între PHP și serverul web, implementat într-o formă care serverul înțelege. Această formă este ceea ce este cunoscut sub numele de SAPI.

Există diferite tipuri de SAPI-uri pentru diferite extensii de server web. De exemplu, pe lângă cele enumerate mai sus, alte SAPI pentru limbajul PHP includ Common Gateway Interface (CGI) și interfața liniei de comandă (CLI).

PHP poate fi, de asemenea, utilizat pentru scrierea aplicațiilor de interfață grafică de utilizator desktop (GUI), utilizând extensia PHP-GTK . PHP-GTK nu este inclus în distribuția oficială PHP și ca extensie poate fi utilizat numai cu versiunile PHP 5.1.0 și mai noi. Cel mai comun mod de instalare PHP-GTK este compilarea acestuia din codul sursă.

Când PHP este instalat și utilizat în medii cloud , sunt furnizate kituri de dezvoltare software (SDK) pentru utilizarea caracteristicilor specifice cloud. De exemplu:

Sunt acceptate numeroase opțiuni de configurare, care afectează atât funcțiile de bază PHP, cât și extensiile. Fișierul de configurare php.inieste căutat în locații diferite, în funcție de modul în care este utilizat PHP. Fișierul de configurare este împărțit în diferite secțiuni, în timp ce unele dintre opțiunile de configurare pot fi, de asemenea, setate în configurația serverului web.

Utilizare

O prezentare generală a pachetului de software LAMP, afișată aici împreună cu Squid

PHP este un limbaj de scriptare de uz general care este potrivit mai ales dezvoltării web pe partea de server , caz în care PHP rulează în general pe un server web . Orice cod PHP dintr-un fișier solicitat este executat de runtime PHP, de obicei pentru a crea conținut dinamic de pagină web sau imagini dinamice folosite pe site-uri web sau în altă parte. Poate fi, de asemenea, utilizat pentru scripturi pe linia de comandă și aplicații de interfață grafică de utilizator (GUI) pentru partea clientului . PHP poate fi implementat pe majoritatea serverelor web, multe sisteme de operare și platforme și poate fi utilizat cu multe sisteme de gestionare a bazelor de date relaționale (RDBMS). Majoritatea furnizorilor de găzduire web acceptă PHP pentru utilizarea de către clienții lor. Este disponibil gratuit, iar Grupul PHP oferă codul sursă complet pentru utilizatori, pentru a-l construi, personaliza și extinde pentru propria utilizare.

Pagină web dinamică: exemplu de scriptare pe partea de server (PHP și MySQL)

Inițial conceput pentru a crea dinamice pagini web , PHP acum se concentrează în principal pe server-side scripting , și este similar cu alte limbaje de scripting server-side , care oferă conținut dinamic de pe un server web la un client , cum ar fi Microsoft e ASP.NET , Paginile JavaServer ale Sun Microsystems și . PHP a atras, de asemenea, dezvoltarea multor cadre software care oferă elemente de bază și o structură de proiectare pentru a promova dezvoltarea rapidă a aplicațiilor (RAD). Unele dintre acestea includ PRADO , CakePHP , Symfony , CodeIgniter , Laravel , Yii Framework , Phalcon și Laminas , oferind caracteristici similare cu alte cadre web . mod_perl

Arhitectura LAMP a devenit popular în industria de web ca o modalitate de a implementa aplicații web. PHP este utilizat în mod obișnuit ca P în acest pachet alături de Linux , Apache și MySQL , deși P se poate referi și la Python , Perl sau la un amestec dintre cele trei. Pachete similare, WAMP și MAMP , sunt disponibile și pentru Windows și macOS , prima literă reprezentând sistemul de operare respectiv. Deși atât PHP, cât și Apache sunt furnizate ca parte a instalării macOS de bază, utilizatorii acestor pachete caută un mecanism de instalare mai simplu, care poate fi actualizat mai ușor.

Pentru scenarii de utilizare specifice și mai avansate, PHP oferă un mod bine definit și documentat de scriere a extensiilor personalizate în C sau C ++ . Pe lângă extinderea limbajului în sine sub formă de biblioteci suplimentare , extensiile oferă o modalitate de îmbunătățire a vitezei de execuție acolo unde este esențială și există loc de îmbunătățiri prin utilizarea unui limbaj compilat adevărat . PHP oferă, de asemenea, modalități bine definite de încorporare în alte proiecte software. În acest fel, PHP poate fi utilizat cu ușurință ca limbaj de script intern pentru un alt proiect, oferind, de asemenea, o interfață strânsă cu structurile de date interne specifice proiectului .

PHP a primit recenzii mixte din cauza lipsei suportului pentru multithreading la nivelul limbajului de bază, deși utilizarea threadurilor este posibilă prin extensia PECL „pthreads” .

Au fost produse o interfață de linie de comandă, php-cli și două motoare de scriptare ActiveX Windows Script Host pentru PHP.

Popularitate și statistici de utilizare

PHP este utilizat pentru sistemele de gestionare a conținutului web, inclusiv MediaWiki , WordPress , Joomla , Drupal , Moodle , eZ Publish , eZ Platform și SilverStripe .

Site-urile care utilizează PHP includ Facebook , Digg , Dailymotion și Tumblr .

Începând din ianuarie 2013, PHP a fost utilizat în peste 240 de milioane de site-uri web (39% dintre cele eșantionate) și a fost instalat pe 2,1 milioane de servere web .

Începând din martie 2021, PHP a fost folosit ca limbaj de programare pe partea de server pe 79,1% din site-uri web, în ​​scădere de la 83,5% anterior, unde limbajul putea fi determinat, iar PHP 7 este cea mai utilizată versiune a limbajului, cu 50,3% din toate site-urile de pe web folosesc acea versiune.

Securitate

În 2019, 11% din toate vulnerabilitățile enumerate de baza de date națională a vulnerabilităților au fost legate de PHP; istoric, aproximativ 30% din toate vulnerabilitățile enumerate din 1996 în această bază de date sunt legate de PHP. Defectele tehnice de securitate ale limbajului în sine sau ale bibliotecilor sale de bază nu sunt frecvente (22 în 2009, aproximativ 1% din total, deși PHP se aplică aproximativ 20% din programele enumerate). Recunoscând că programatorii fac greșeli, unele limbaje includ verificarea taint pentru a detecta automat lipsa validării intrărilor care induce multe probleme. O astfel de caracteristică este dezvoltată pentru PHP, dar includerea acesteia într-o versiune a fost respinsă de mai multe ori în trecut.

Există patch - uri avansate de protecție , cum ar fi Suhosin și calire -Patch, în special concepute pentru medii de găzduire web.

Din punct de vedere istoric, versiunile vechi ale PHP aveau câțiva parametri de configurare și valori implicite pentru astfel de setări de runtime care făceau ca unele aplicații PHP să fie predispuse la probleme de securitate. Printre acestea, magic_quotes_gpcși register_globalsdirectivele de configurare au fost cele mai cunoscute; acesta din urmă a făcut ca orice parametru URL să devină variabile PHP, deschizând o cale pentru vulnerabilități grave de securitate, permițând unui atacator să seteze valoarea oricărei variabile globale neinițializate și să interfereze cu executarea unui script PHP. Suportul pentru setările „ citate magice ” și „registru global” a fost depreciat de la PHP 5.3.0 și eliminat din PHP 5.4.0.

Un alt exemplu pentru vulnerabilitatea potențială a setărilor runtime vine din eșecul dezactivării execuției PHP (de exemplu prin utilizarea enginedirectivei de configurare) pentru directorul în care sunt stocate fișierele încărcate; activarea acestuia poate duce la executarea unui cod rău intenționat încorporat în fișierele încărcate. Cea mai bună practică este fie să localizați directorul de imagini în afara rădăcinii documentului disponibil pentru serverul web și să îl difuzați prin script intermediar, fie să dezactivați executarea PHP pentru directorul care stochează fișierele încărcate.

De asemenea, activarea încărcării dinamice a extensiilor PHP (prin enable_dldirectivă de configurare) într-un mediu de găzduire web partajat poate duce la probleme de securitate.

Conversiile de tip implicite care au ca rezultat valori diferite fiind tratate ca egale, uneori împotriva intenției programatorului, pot duce la probleme de securitate. De exemplu, rezultatul comparației '0e1234' == '0'este true, deoarece șirurile care pot fi analizate ca numere sunt convertite în numere; în acest caz, prima valoare comparată este tratată ca notație științifică având valoarea (0 × 10 1234 ), care este zero. Erori de acest gen au dus la vulnerabilități de autentificare în Simple Machines Forum , Typo3 și phpBB atunci când hash- urile parolei MD5 au fost comparate. Modul recomandat este de a utiliza hash_equals () (pentru sincronizarea siguranței atacului ) strcmpsau operatorul de identitate ( ===), ca '0e1234' === '0'rezultat false.

Într - o analiză 2013 a peste 170,000 defacements website , publicat de Zone-H , cel mai frecvent (53%) Tehnica utilizată a fost exploatarea vulnerabilității de incluziune fișier , mai ales în legătură cu utilizarea nesigură a constructelor limbaj PHP include, requireși allow_url_fopen.

Începând cu aprilie 2021, W3Techs raportează că 64% din site-urile care utilizează PHP utilizează versiunile 7.2 sau mai vechi (care nu mai sunt acceptate de Echipa de dezvoltare PHP), cu 35% din toate site-urile PHP care utilizează versiunea 5.6 sau mai vechi.

Versiunea 5 este încă utilizată de 24,5% din toate site-urile (septembrie 2021). Este foarte recomandat să migrați la versiunea PHP 7 sau 8 și să utilizați random_int () în loc de rand () sau mt_rand (). Există două atacuri care pot fi efectuate peste surse de entropie PHP: „Seed Attack” și „State recovery attack”. Cu tehnologiile GPU actuale, un atacator poate efectua până la 2 ^ 30 calcule MD5 pe secundă cu un GPU de 250 USD, în timp ce cu 500 USD suplimentari poate ajunge până la 2 ^ 32 de calcule. În combinație cu „ Atacul zilei de naștere ”, acest lucru poate duce la vulnerabilități grave de securitate.

Vezi si

Referințe

Lecturi suplimentare

Ascultați acest articol ( 35 de minute )
Pictogramă Wikipedia vorbită
Acest fișier audio a fost creat dintr-o revizuire a acestui articol din 23 noiembrie 2011 și nu reflectă modificările ulterioare. ( 23.11.2011 )

linkuri externe