PHP - PHP

PHP
PHP-logo.svg
Paradigm Multi-paradigm : imperativ , funktionell , objektorienterad , procedurell , reflekterande
Designad av Rasmus Lerdorf
Utvecklare PHP Development Team, Zend Technologies
Första gången dök upp 8 juni 1995 ; 26 år sedan ( 1995-06-08 )
Stabil frisättning
8.0.11  Redigera detta på Wikidata / 23 september 2021 ; 24 dagar sedan ( 23 september 2021 )
Förhandsgranskning
8.1.0 Beta 1  Redigera detta på Wikidata /22 juli 2021 ; 2 månader sedan ( 22 juli 2021 )
Skrivdisciplin Dynamisk , svag

sedan version 7.0:

Gradvis
Implementeringsspråk C (främst; vissa komponenter C ++ )
OS Unix-liknande , Windows , macOS , IBM i , OpenVMS
Licens PHP -licens (det mesta av Zend -motor under Zend Engine -licens )
Filnamnstillägg .php, .phar, .phtml, .pht,.phps
Hemsida www .php .net Redigera detta på Wikidata
Stora implementeringar
Zend Engine , HHVM , PeachPie , Quercus , Papegoja
Påverkad av
Perl , HTML , C , C ++ , Java , Tcl , JavaScript , Hack
Påverkad
Hack , JSP , ASP

PHP är ett allmänt ändamål skriptspråk inriktad webbutveckling . Det skapades ursprungligen av dansk-kanadensiska programmeraren Rasmus Lerdorf 1994. PHP- referensimplementeringen produceras nu av The PHP Group. PHP stod ursprungligen för Personal Home Page , men det står nu för rekursiv initialism PHP: Hypertext Preprocessor .

PHP -kod bearbetas vanligtvis på en webbserver av en PHP -tolk som implementeras som en modul , en daemon eller som en Common Gateway Interface (CGI) körbar. På en webbserver skulle resultatet av den tolkade och exekverade PHP -koden - som kan vara vilken typ av data som helst, till exempel genererad HTML eller binär bilddata - utgöra hela eller en del av ett HTTP -svar. Olika webbmall system , web content management system och webb ramar existerar som kan användas att iscensätta eller underlätta genereringen av detta svar. Dessutom kan PHP användas för många programmeringsuppgifter utanför webbkontexten, till exempel fristående grafiska applikationer och robotisk drönarkontroll . PHP -kod kan också köras direkt från kommandoraden .

Standard PHP -tolk, som drivs av Zend Engine , är gratis programvara som släpps under PHP -licensen . PHP har vidarebefordrats och kan distribueras på de flesta webbservrar på en mängd olika operativsystem och plattformar .

PHP -språket utvecklades utan en skriftlig formell specifikation eller standard fram till 2014, med den ursprungliga implementeringen som de facto -standarden som andra implementeringar avsåg att följa. Sedan 2014 har arbetet pågått med att skapa en formell PHP -specifikation.

W3Techs rapporterar att från och med april 2021 används "PHP av 79,2% av alla webbplatser vars programmeringsspråk på serversidan vi känner till."

Historia

Tidig historia

Rasmus Lerdorf , som skrev den ursprungliga komponenten Common Gateway Interface (CGI), tillsammans med Andi Gutmans och Zeev Suraski , som skrev om parsern som bildade PHP 3.

PHP -utvecklingen började 1994 när Rasmus Lerdorf skrev flera CGI -program ( Common Gateway Interface ) i C , som han använde för att behålla sin personliga hemsida . Han utvidgade dem till att arbeta med webbformulär och för att kommunicera med databaser , och kallade denna implementering "Personal Home Page/Forms Interpreter" eller PHP/FI.

PHP/FI kan användas för att bygga enkla, dynamiska webbapplikationer . För att påskynda bug rapportering och förbättra koden, Lerdorf tillkännagav början frisläppandet av PHP / FI som "personliga hemida Tools (PHP Tools) Version 1.0" på Usenet diskussionsgruppen comp.infosystems.www.authoring.cgi den 8 juni, 1995 Denna version hade redan den grundläggande funktionaliteten som PHP har idag. Detta inkluderade Perl-liknande variabler , formulärhantering och möjligheten att bädda in HTML . Den syntax liknade den i Perl , men var enklare, mer begränsad och mindre konsekvent.

Ett exempel på den tidiga PHP -syntaxen :

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

Tidigt PHP var inte avsett att vara ett nytt programmeringsspråk , och växte organiskt, med Lerdorf i efterhand: "Jag vet inte hur jag ska stoppa det, det var aldrig avsikt att skriva ett programmeringsspråk [...] Jag har absolut ingen aning om hur man skriver ett programmeringsspråk, jag fortsatte bara att lägga till nästa logiska steg på vägen. " Ett utvecklingsteam började bilda och efter månaders arbete och betatest släppte man officiellt PHP/FI 2 i november 1997.

Det faktum att PHP inte ursprungligen designades utan istället utvecklades organiskt har lett till inkonsekvent namngivning av funktioner och inkonsekvent ordning av deras parametrar. I vissa fall valdes funktionsnamnen för att matcha de lägre nivåbiblioteken som PHP "packade", medan i vissa mycket tidiga versioner av PHP användes funktionsnamnens längd internt som en hash-funktion , så namn valdes till förbättra distributionen av hashvärden .

PHP 3 och 4

Detta är ett exempel på anpassad PHP -kod för WordPress content management system .

Zeev Suraski och Andi Gutmans skrev om parsern 1997 och utgjorde grunden för PHP 3 och ändrade språkets namn till den rekursiva akronymen PHP: Hypertext Preprocessor . Efteråt började den offentliga testningen av PHP 3 och den officiella lanseringen kom i juni 1998. Suraski och Gutmans startade sedan en ny omskrivning av PHP: s kärna, som producerade Zend Engine 1999. De grundade också Zend Technologies i Ramat Gan , Israel .

Den 22 maj 2000 släpptes PHP 4, som drivs av Zend Engine 1.0. I augusti 2008 hade denna gren nått version 4.4.9. PHP 4 är nu inte längre under utveckling och inga säkerhetsuppdateringar planeras att släppas.

PHP 5

Den 1 juli 2004 släpptes PHP 5, drivs av nya Zend Engine II. PHP 5 inkluderade nya funktioner som förbättrat stöd för objektorienterad programmering , PHP Data Objects (PDO) -tillägget (som definierar ett lätt och konsekvent gränssnitt för åtkomst till databaser) och många prestandaförbättringar. 2008 blev PHP 5 den enda stabila versionen under utveckling. Sen statisk bindning hade saknats från tidigare versioner av PHP och tillkom i version 5.3.

Många högprofilerade öppen källkodsprojekt upphörde att stödja PHP 4 i ny kod från den 5 februari 2008 på grund av GoPHP5-initiativet, tillhandahållet av ett konsortium av PHP-utvecklare som främjar övergången från PHP 4 till PHP 5.

Med tiden blev PHP-tolkar tillgängliga på de flesta befintliga 32-bitars och 64-bitars operativsystem, antingen genom att bygga dem från PHP-källkoden eller genom att använda förbyggda binärer. För PHP-versionerna 5.3 och 5.4 var de enda tillgängliga Microsoft Windows- binära distributionerna 32-bitars IA-32- builds, vilket kräver Windows 32-bitars kompatibilitetsläge när man använder Internet Information Services (IIS) på en 64-bitars Windows-plattform. PHP version 5.5 gjorde 64-bitars x86-64- versionen tillgänglig för Microsoft Windows.

Officiellt säkerhetsstöd för PHP 5.6 slutade den 31 december 2018.

PHP 6 och Unicode

PHP fick blandade recensioner på grund av att det saknade inbyggt Unicode -stöd på grundspråknivå. År 2005 inleddes ett projekt som leddes av Andrei Zmievski för att ge inbyggt Unicode- stöd i hela PHP, genom att bädda in International Components for Unicode (ICU) bibliotek och representera textsträngar som UTF-16 internt. Eftersom detta skulle orsaka stora förändringar både av språkets interna och användarkod, var det planerat att släppa detta som version 6.0 av språket, tillsammans med andra viktiga funktioner som sedan utvecklades.

Brist på utvecklare som förstod de nödvändiga förändringarna och prestandaproblem som uppstod från konvertering till och från UTF-16, som sällan används i webbkontext, ledde dock till förseningar i projektet. Som ett resultat skapades en PHP 5.3-version 2009, med många icke-Unicode-funktioner som backportas från PHP 6, särskilt namnområden. I mars 2010 övergavs projektet i sin nuvarande form officiellt och en PHP 5.4-version utarbetades som innehåller de flesta återstående icke-Unicode-funktionerna från PHP 6, såsom egenskaper och återbindning av stängning. De första förhoppningarna var att en ny plan skulle bildas för Unicode -integration, men 2014 hade ingen antagits.

PHP 7

Under 2014 och 2015 utvecklades en ny större PHP -version, PHP 7. Numreringen av denna version innebar viss debatt bland interna utvecklare. Även om PHP 6 Unicode -experimentet aldrig hade släppts, hänvisade flera artiklar och boktitlar till PHP 6 -namnet, vilket kan ha orsakat förvirring om en ny version skulle återanvända namnet. Efter en omröstning valdes namnet PHP 7.

Grunden för PHP 7 är en PHP -filial som ursprungligen kallades för PHP nästa generation ( phpng ). Den var författad av Dmitry Stogov, Xinchen Hui och Nikita Popov, och syftade till att optimera PHP-prestanda genom att ombygga Zend Engine samtidigt som den behåller nästan fullständig språkkompatibilitet. Vid den 14 juli 2014 visade WordPress -baserade riktmärken, som fungerade som den viktigaste riktmärket för phpng -projektet, en prestationsökning på nästan 100%. Ändringar från phpng gör det lättare att förbättra prestanda i framtida versioner, eftersom mer kompakta datastrukturer och andra ändringar ses som bättre lämpade för en lyckad migrering till en just-in-time (JIT) kompilator. På grund av de betydande förändringarna kallades den omarbetade Zend Engine Zend Engine 3 , efterträdande Zend Engine 2 som används i PHP 5.

På grund av de stora interna förändringarna i phpng måste den få ett nytt större versionsnummer för PHP, snarare än en mindre PHP 5 -utgåva, enligt PHP: s releaseprocess. Stora versioner av PHP tillåts bryta bakåtkompatibilitet av kod och därför gav PHP 7 en möjlighet för andra förbättringar utöver phpng som kräver bakåtkompatibilitetsavbrott. I synnerhet innebar det följande ändringar:

  • Många tidigare eller felaktiga PHP-felmekanismer för dödlig eller återvinningsbar nivå ersattes med moderna objektorienterade undantag .
  • Syntaxen för variabel dereferencing omarbetades för att vara internt mer konsekvent och fullständig, vilket gör användningen av operatörerna ->, [], (), {}, och ::med godtyckliga meningsvänstersidan uttryck.
  • Stöd för äldre konstruktörsmetoder i PHP-stil har utfasats.
  • foreachUttalandet av uttalandet ändrades till att vara mer förutsägbart.
  • Konstruktörer för de få klasserna som är inbyggda i PHP som returnerade noll vid misslyckande ändrades för att istället göra ett undantag för konsekvens.
  • Flera ounderhållna eller utfasade serverprogrammeringsgränssnitt (SAPI) och tillägg togs bort från PHP -kärnan, framför allt det äldre mysqltillägget.
  • list()Operatörens beteende ändrades för att ta bort stöd för strängar.
  • Support togs bort för äldre ASP-typ avgränsare <%och %>och <script language="php"> ... </script>.
  • En övervakning som möjliggjorde att ett switch -uttalande hade flera defaultklausuler fixades.
  • Stöd för hexadecimalt talstöd vid vissa implicita omvandlingar från strängar till numretyper togs bort.
  • De vänsterskift och högerskift operatörer ändrades att bete sig mer konsekvent på olika plattformar.
  • Konverteringar mellan flytande tal och heltal ändrades (t.ex. oändlighet ändrades för att konvertera till noll) och implementerades mer konsekvent över plattformar.

PHP 7 inkluderade också nya språkfunktioner. Framför allt introducerade de returtypdeklarationer för funktioner som kompletterar de befintliga parametertypdeklarationerna och stöd för skalartyperna (heltal, float, string och boolean) i parameter- och returtypdeklarationer.

PHP 8

PHP 8 släpptes den 26 november 2020. PHP 8 är en större version och har stora förändringar från tidigare versioner. Nya funktioner och anmärkningsvärda ändringar inkluderar:

Sammanställning precis i tid

Just-in-time-sammanställning stöds i PHP 8.

PHP 8: s JIT -kompilator kan ge betydande prestandaförbättringar för vissa användningsfall. PHP-utvecklaren Nikita Popov har uttalat att prestandaförbättringarna för de flesta webbplatser kommer att vara mindre betydande än uppgraderingen från PHP 5 till PHP 7. Prestandaförbättringar på grund av tillägget av JIT-kompilatorn förväntas bli mer betydande för matematiska funktioner än för vanliga webbutvecklingsanvändningsfall. Dessutom ger JIT -kompilatorn framtida potential att flytta lite kod från C till PHP, på grund av prestandaförbättringarna för vissa användningsfall.

Tillägg av matchuttrycket

PHP 8 introducerade matchuttrycket. Matchuttrycket liknar begreppsmässigt ett switchuttalande och är mer kompakt för vissa användningsfall. Eftersom det matchär ett uttryck kan dess resultat fångas in i en variabel eller returneras från en funktion.

Skriv ändringar och tillägg

PHP 8 introducerade fackföreningstyper, en ny staticreturtyp och en ny mixedtyp.

"Attribut", som ofta kallas "annoteringar" på andra programmeringsspråk, har lagts till i PHP 8, vilket gör att metadata kan läggas till i klasser.

throwändrades från att vara ett uttalande till att vara ett uttryck. Detta gör att undantag kan kastas på platser som inte tidigare var möjliga.

Syntaxförändringar och tillägg

PHP 8 innehåller ändringar för att möjliggöra alternativa, mer kortfattade eller mer konsekventa syntaxer i ett antal scenarier. Till exempel liknar nullsafe -operatören null -koalesceringsoperatören ?? , men används vid anrop av metoder. Följande kodavsnitt kommer inte att ge ett fel om getBirthday()returnerar null:

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

Konstruktörsegendomskampanj har lagts till som " syntaktiskt socker ", vilket gör att klassegenskaper kan ställas in automatiskt när parametrar skickas till en klasskonstruktör . Detta minskar mängden pannkodskod som måste skrivas.

Andra mindre förändringar inkluderar stöd för användning av ::classobjekt, som fungerar som ett alternativ för användning av get_class(); fångster som inte fångas i block för försök att fånga; variabla syntax tweaks för att lösa inkonsekvenser; stöd för namngivna argument; och stöd för efterkommande kommatecken i parameterlistor, vilket ger konsistens med stöd för kommande kommatecken i andra sammanhang, till exempel i matriser.

Standard biblioteksändringar och tillägg

  • Svaga kartor har lagts till i PHP 8. A WeakMapinnehåller referenser till objekt, men dessa referenser hindrar inte att sådana objekt samlas in . Detta kan ge prestandaförbättringar i scenarier där data cachas ; Detta är särskilt relevant för ORM .
  • Olika justeringar av gränssnitt, till exempel att lägga till stöd för att skapa DateTimeobjekt från gränssnitt, och tillägg av ett Stringablegränssnitt som kan användas för typtips.
  • Olika nya funktioner inklusive str_contains (), str_starts_with () och str_ends_with (); fdiv (); get_debug_type (); och get_resource_id ()
  • Objektimplementering av token_get_all ()

Ytterligare ändringar

  • Typkommentarer har också lagts till i PHP: s C -källkod själv för att tillåta interna funktioner och metoder att ha "fullständig typinformation i reflektion".
  • Arv med privata metoder
  • Abstrakta metoder i egenskaper förbättringar

Släpphistorik

Version Utgivningsdatum Stöds tills Anteckningar
Gammal version, underhålls inte längre: 1.0 8 juni 1995 Officiellt kallad "Personal Home Page Tools (PHP Tools)". Detta är den första användningen av namnet "PHP".
Gammal version, underhålls inte längre: 2.0 1 november 1997 Officiellt kallad "PHP/FI 2.0". Detta är den första versionen som faktiskt kan karakteriseras som PHP, som är ett fristående språk med många funktioner som har utstått idag.
Gammal version, underhålls inte längre: 3.0 6 juni 1998 20 oktober 2000 Utvecklingen går från en person till flera utvecklare. Zeev Suraski och Andi Gutmans skriver om basen för den här versionen.
Gammal version, underhålls inte längre: 4.0 22 maj 2000 23 juni 2001 Lade till mer avancerat tvåstegs analys/kör tag-analys system som kallas Zend-motorn.
Gammal version, underhålls inte längre: 4.1 10 december 2001 12 mars 2002 Infört "superglobals" ( $_GET, $_POST, $_SESSION, etc.)
Gammal version, underhålls inte längre: 4.2 22 april 2002 6 september 2002 Inaktiverad som register_globalsstandard. Data som tas emot via nätverket infogas inte längre direkt i det globala namnområdet och stänger möjliga säkerhetshål i applikationer.
Gammal version, underhålls inte längre: 4.3 27 december 2002 31 mars 2005 Introducerade kommandoradsgränssnittet (CLI) för att komplettera CGI.
Gammal version, underhålls inte längre: 4.4 11 juli 2005 7 augusti 2008 Åtgärdade ett minneskorruptionsfel, vilket krävde att bryta binär kompatibilitet med tillägg kompilerade mot PHP version 4.3.x.
Gammal version, underhålls inte längre: 5.0 13 juli 2004 5 september 2005 Zend Engine II med en ny objektmodell.
Gammal version, underhålls inte längre: 5.1 24 november 2005 24 augusti 2006 Prestandaförbättringar med introduktion av kompilatorvariabler i omkonstruerad PHP Engine. Lade till PHP Data Objects (PDO) som ett konsekvent gränssnitt för åtkomst till databaser.
Gammal version, underhålls inte längre: 5.2 2 november 2006 6 januari 2011 Aktiverade filtertillägget som standard. Native JSON -stöd.
Gammal version, underhålls inte längre: 5.3 30 juni 2009 14 augusti 2014 Stöd för namnutrymme ; sena statiska bindningar , hoppetikett (begränsad goto ), anonyma funktioner , nedläggningar , PHP -arkiv (phar), sophämtning för cirkulära referenser, förbättrat Windows -stöd, sqlite3, mysqlnd som ersättning för libmysql som underliggande bibliotek för de tillägg som fungerar med MySQL , filinfo som ersättning för mime_magic för bättre MIME -stöd , internationaliseringstillägget och avskrivning av ereg -tillägg.
Gammal version, underhålls inte längre: 5.4 1 mars 2012 3 september 2015 Traitstöd , kort array -syntaxstöd. Borttagna objekt: register_globals, safe_mode, allow_call_time_pass_reference, , och . Inbyggd webbserver. Flera förbättringar av befintliga funktioner, prestanda och minskade minneskrav. session_register()session_unregister()session_is_registered()
Gammal version, underhålls inte längre: 5.5 20 juni 2013 10 juli 2016 Stöd för generatorer , finallyblock för undantagshantering, OpCache (baserat på Zend Optimizer+) som ingår i officiell distribution.
Gammal version, underhålls inte längre: 5.6 28 augusti 2014 31 december 2018 Konstanta skaläruttryck , variadiska funktioner , uppackning av argument, ny exponentieringsoperatör, tillägg av useuttalandet för funktioner och konstanter, ny phpdbgfelsökning som en SAPI -modul och andra mindre förbättringar.
6.x Inte släppt Ej tillgängligt Övergiven version av PHP som planerade att inkludera inbyggt Unicode -stöd.
Gammal version, underhålls inte längre: 7,0 3 december 2015 10 januari 2019 Zend Engine 3 (prestandaförbättringar och 64 -bitars heltalsstöd i Windows), enhetlig variabel syntax, AST -baserad kompileringsprocess, tillagd , bitvis skiftkonsistens över plattformar, ( null -koalesce ) -operatör, Unicode -kodpunkts -escape -syntax , returtypdeklarationer, skalär typ (heltal, flottör, sträng och booleska) deklarationer, "rymdskepp" trevägs jämförelse operatör, generator delegering, anonyma klasser , enklare och mer konsekvent tillgängliga CSPRNG API, ersättning av många återstående interna PHP "fel" med de mer moderna undantagen , och stenografi syntax för att importera flera objekt från ett namnområde. Closure::call()??<=>
Gammal version, underhålls inte längre: 7.1 1 december 2016 1 december 2019 void return type , klass konstant synlighet modifierare
Gammal version, underhålls inte längre: 7.2 30 november 2017 30 november 2020 Objektparameter och returtypdeklaration, Libsodium -förlängning, abstrakt metodöverträdelse, parametertypsutvidgning
Äldre version, men ändå underhållen: 7.3 6 december 2018 6 december 2021 Flexibel Heredoc- och Nowdoc -syntax, stöd för referenstilldelning och array -dekonstruktion med lista (), PCRE2 -stöd, hrtime () -funktion
Äldre version, men ändå underhållen: 7.4 28 november 2019 28 november 2022 Typade egenskaper 2.0, förladdning, null-koalescerande uppdragsoperatör, förbättra openssl_random_pseudo_bytes, Svaga referenser, FFI- gränssnitt för främmande funktioner , alltid tillgängligt hash-tillägg, lösenordshash-register, multibyte-strängdelning, reflektion för referenser, buntad ext/wddx, nytt anpassat objekt-serialisering mekanism
Nuvarande stabil version: 8.0 26 november 2020 26 november 2023 Just-In-Time (JIT) -sammanställning , matriser som börjar med ett negativt index, striktare/förnuftigare språksemantik (validering för abstrakta dragmetoder), saner-sträng till taljämförelser, sämre numeriska strängar, TypeError på ogiltiga aritmetiska/bitvisa operatörer, omklassificering av olika motorfel, konsekventa typfel för interna funktioner, dödligt fel för inkompatibla metodunderskrifter), lokaloberoende float till strängkonvertering, variabla syntax tweaks, attribut, namngivna argument, matchuttryck, konstruktörsegendomskampanj, fackföreningstyper, blandad typ, statisk returtyp, nullsäker operatör, icke-fångande fångster, kastuttryck, JSON-tillägg är alltid tillgängligt.
Framtida utgåva: 8.1 25 november 2021 ?? November 2024 Explicit oktalt heltal bokstavsbeteckning, uppräkningar
Legend:
Gammal version
Äldre version, fortfarande underhållen
Senaste versionen
Senaste förhandsversionen
Framtida släpp

Från och med den 28 juni 2011 implementerade PHP Development Team en tidslinje för lansering av nya versioner av PHP. Enligt detta system bör minst en utgåva ske varje månad. En gång per år bör en mindre utgåva inträffa som kan innehålla nya funktioner. Varje mindre utgåva bör åtminstone stödjas i två år med säkerhets- och buggfixar, följt av minst ett år med endast säkerhetsåtgärder, för totalt tre års utgåva för varje mindre version. Inga nya funktioner, om de inte är små och fristående, ska introduceras i en mindre version under den treåriga utgåvan.

Maskot

ElePHPant, PHP maskot

Maskoten för PHP -projektet är elePHPant , en blå elefant med PHP -logotypen på sin sida, designad av Vincent Pontier 1998. "(PHP) bokstäverna formade en elefant om de ses i sidled." ElePHPanten är ibland annorlunda färgad när den är i plyschform .

Många variationer av denna maskot har gjorts genom åren. Endast elePHPants baserade på originaldesignen av Vincent Pontier anses vara officiella av samhället. Dessa är samlingsbara och några av dem är extremt sällsynta.

Syntax

En "Hello World" -applikation i PHP 7.4 som körs på en localhost -utvecklingsserver

Följande "Hej, värld!" programmet är skrivet i PHP -kod inbäddat i ett HTML -dokument:

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

Eftersom det inte finns något krav för att PHP -kod ska vara inbäddad i HTML, den enklaste versionen av Hello, World! kan skrivas så här, med sluttaggen utelämnad som föredragen i filer som innehåller ren PHP -kod ?>

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

PHP -tolken kör bara PHP -kod inom sina avgränsare . Allt utanför dess avgränsare behandlas inte av PHP, även om icke-PHP-text fortfarande är föremål för kontrollstrukturer som beskrivs i PHP-kod. De vanligaste avgränsarna är <?phpatt öppna och stänga PHP -sektioner. Den förkortade formen finns också. Denna korta avgränsare gör skriptfiler mindre portabla, eftersom stöd för dem kan inaktiveras i den lokala PHP -konfigurationen och därför avskräcks. Omvänt finns det ingen rekommendation mot ekokorttaggen . Före PHP 5.4.0 fungerar den här korta syntaxen endast med konfigurationsinställningen aktiverad, medan den för PHP 5.4.0 och senare alltid är tillgänglig. Syftet med alla dessa avgränsare är att skilja PHP-kod från icke-PHP-innehåll, till exempel JavaScript- kod eller HTML-markering. Så den kortaste "Hej, värld!" programmet skrivet i PHP är: ?><?<?=echoshort_open_tag

<?='Hello, World!';

Den första formen av avgränsare <?phpoch i XHTML och andra XML -dokument skapar korrekt utformade XML -bearbetningsinstruktioner. Det betyder att den resulterande blandningen av PHP-kod och annan markering i serversidan är en välformad XML. ?>

Variabler har ett prefix med en dollarsymbol , och en typ behöver inte anges i förväg. PHP 5 introducerade typdeklarationer som gör det möjligt för funktioner att tvinga sina parametrar att vara objekt i en specifik klass, matriser, gränssnitt eller återuppringningsfunktioner . Men före PHP 7 kunde typdeklarationer inte användas med skalärtyper som heltal eller sträng.

Nedan följer ett exempel på hur PHP -variabler deklareras och initieras.

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

Till skillnad från funktions- och klassnamn är variabelnamn skiftlägeskänsliga. Både dubbelciterade ("") och heredoc- strängar ger möjlighet att interpolera en variabels värde i strängen. PHP behandlar newlines som blanksteg på ett språk i fritt format , och uttalanden avslutas med ett semikolon. PHP har tre typer av kommentarsyntax : /* */markerar block och inline kommentarer; //eller #används för enradiga kommentarer. Det echouttalandet är en av flera anläggningar PHP ger att mata text.

När det gäller sökord och språksyntax liknar PHP C -syntaxen. ifvillkor foroch whileslingor och funktionsreturer liknar i syntax språk som C, C ++, C#, Java och Perl.

Datatyper

PHP är löst maskinskrivet . Den lagrar heltal i ett plattformsberoende område, antingen som ett 32, 64 eller 128-bitars signerat heltal motsvarande den C-språkiga långa typen . Osignerade heltal konverteras till signerade värden i vissa situationer, vilket är annorlunda än många andra programmeringsspråk. Heltalsvariabler kan tilldelas med hjälp av decimaler (positiva och negativa), oktala , hexadecimala och binära notationer.

Flytpunktnummer lagras också i ett plattformsspecifikt område. De kan specificeras med hjälp av flytande punktnotation eller två former av vetenskaplig notation . PHP har en inbyggd boolsk typ som liknar de inhemska booleska typerna i Java och C ++ . Genom att använda de booleska konverteringsreglerna tolkas värden som inte är noll som sanna och noll som falska, som i Perl och C ++.

Datatypen null representerar en variabel som inte har något värde; NULLär det enda tillåtna värdet för denna datatyp.

Variabler av typen "resurs" representerar referenser till resurser från externa källor. Dessa skapas vanligtvis av funktioner från en viss tillägg, och kan endast bearbetas av funktioner från samma tillägg; exempel inkluderar fil-, bild- och databasresurser.

Arrays kan innehålla element av vilken typ som helst som PHP kan hantera, inklusive resurser, objekt och till och med andra arrays. Ordning bevaras i listor över värden och i hash med både nycklar och värden, och de två kan blandas. PHP stöder också strängar , som kan användas med enkla citattecken, dubbla citattecken, nowdoc eller heredoc syntax.

Den Standard PHP Library (SPL) försöker lösa vanliga problem och genomför effektiva gränssnitt dataåtkomst och klasser.

Funktioner

PHP definierar ett stort antal funktioner på kärnspråket och många finns också i olika tillägg; dessa funktioner är väl dokumenterade i PHP -dokumentationen online . Det inbyggda biblioteket har dock en mängd olika namngivningskonventioner och tillhörande inkonsekvenser, som beskrivs under historien ovan.

Anpassade funktioner kan definieras av utvecklaren:

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

År 2021 är resultatet av ovanstående provprogram "Jag är för närvarande 26 år gammal."

Istället för funktionspekare kan funktioner i PHP refereras av en sträng som innehåller deras namn. På detta sätt kan vanliga PHP -funktioner användas, till exempel som återuppringning eller inom funktionstabeller . Användardefinierade funktioner kan skapas när som helst utan att vara prototyperade . Funktioner kan definieras inuti kodblock, vilket möjliggör ett körtidsbeslut om huruvida en funktion ska definieras eller inte. Det finns en function_existsfunktion som avgör om en funktion med ett visst namn redan har definierats. Funktionsanrop måste använda parenteser, med undantag för konstruktörsfunktioner med nollargumentklass som anropas med PHP-operatören new, i vilket fall parenteser är valfria.

Fram till PHP 5.3 fanns det inte stöd för anonyma funktioner och stängningar i PHP. Även om det create_function()har funnits sedan PHP 4.0.1, är det bara ett tunt omslag eval()som gör att vanliga PHP -funktioner kan skapas under programkörning. PHP 5.3 lade till syntax för att definiera en anonym funktion eller " stängning " som kan fånga variabler från det omgivande omfånget. Shorthand arrow syntax har lagts till i PHP 7.4:

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

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

I exemplet ovan getAdder()skapar funktionen en stängning med hjälp av passerat argument $x(nyckelordet useimporterar en variabel från det lexikaliska sammanhanget), vilket tar ett ytterligare argument $yoch returnerar den skapade stängningen till den som ringer. En sådan funktion är ett förstklassigt objekt, vilket innebär att den kan lagras i en variabel, skickas som en parameter till andra funktioner etc.

Ovanligt för ett dynamiskt skrivet språk stöder PHP typdeklarationer om funktionsparametrar som tillämpas vid körning. Detta har stötts för klasser och gränssnitt sedan PHP 5.0, för arrays sedan PHP 5.1, för "callables" sedan PHP 5.4 och scalar (integer, float, string och boolean) sedan PHP 7.0. PHP 7.0 har också typdeklarationer för funktionsreturtyper, uttryckta genom att placera typnamnet efter parameterlistan, föregående av ett kolon. Till exempel kan getAdderfunktionen från det tidigare exemplet kommenteras med typer som i 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

Som standard följer skalartypdeklarationer svaga skrivprinciper. Så, till exempel, om en parametertyp är int, skulle PHP tillåta att inte bara heltal, utan även konvertibla numeriska strängar, flottörer eller booleaner skickas till den funktionen och konverterar dem. PHP 7 har emellertid ett "strikt skrivande" -läge som, när det används, tillåter sådana konverteringar för funktionssamtal och returnerar inom en fil.

PHP -objekt

Grundläggande objektorienterad programmeringsfunktion lades till i PHP 3 och förbättrades i PHP 4. Detta gjorde det möjligt för PHP att få ytterligare abstraktion, vilket gjorde kreativa uppgifter enklare för programmerare som använder språket. Objekthantering skrevs om helt för PHP 5, utökade funktionsuppsättningen och förbättrade prestandan. I tidigare versioner av PHP hanterades objekt som värdetyper . Nackdelen med denna metod var att koden måste använda PHP: s "referens" -variabler kraftigt om den ville modifiera ett objekt som den skickades i stället för att skapa en kopia av den. I den nya metoden refereras objekt till med handtag , och inte efter värde.

PHP 5 introducerade privata och skyddade medlemsvariabler och metoder, tillsammans med abstrakta klasser , slutklasser , abstrakta metoder och slutliga metoder . Det introducerade också ett standard sätt att deklarera konstruktörer och destruktorer , liknande det för andra objektorienterade språk som C ++ , och en standard undantagshanteringsmodell . Dessutom lade PHP 5 till gränssnitt och möjliggjorde att flera gränssnitt kunde implementeras. Det finns speciella gränssnitt som gör att objekt kan interagera med körningssystemet. Objekt som implementerar ArrayAccess kan användas med array -syntax och objekt som implementerar Iterator eller IteratorAggregate kan användas med foreach språkkonstruktionen . Det finns ingen virtuell tabellfunktion i motorn, så statiska variabler är bundna med ett namn istället för en referens vid kompileringstidpunkten.

Om utvecklaren skapar en kopia av ett objekt med det reserverade ordet clone, kommer Zend -motorn att kontrollera om en __clone()metod har definierats. Om inte, kommer det att ange en standard __clone()som kopierar objektets egenskaper. Om en __clone()metod är definierad, kommer den att vara ansvarig för att ställa in nödvändiga egenskaper i det skapade objektet. För enkelhets skull kommer motorn att tillhandahålla en funktion som importerar egenskaperna för källobjektet, så att programmeraren kan börja med en eftervärdesreplika av källobjektet och endast åsidosätta egenskaper som behöver ändras.

Den synlighet av PHP egenskaper och metoder definieras enligt nyckelord public , privateoch protected. Standard är offentlig, om endast var används; varär en synonym för public. Objekt som deklareras publickan nås överallt. protectedbegränsar åtkomsten till ärvda klasser (och till klassen som definierar objektet). privatebegränsar synligheten endast till klassen som definierar objektet. Objekt av samma typ har tillgång till varandras privata och skyddade medlemmar trots att de inte är samma instans.

Exempel

Följande är ett grundläggande exempel på objektorienterad programmering i 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

Implementeringar

Den enda kompletta PHP -implementeringen är originalet, helt enkelt känt som PHP. Det är den mest använda och drivs av Zend Engine . För att skilja det från andra implementeringar kallas det ibland inofficiellt "Zend PHP". Zend Engine sammanställer PHP- källkoden direkt i ett internt format som den kan köra, så den fungerar som tolk . Det är också "referensimplementeringen" av PHP, eftersom PHP inte har någon formell specifikation, och därför definierar Zend PHP semantik PHP: s semantik. På grund av PHP: s komplexa och nyanserade semantik, definierad av hur Zend fungerar, är det svårt för konkurrerande implementationer att erbjuda fullständig kompatibilitet.

PHP: s enkelförfrågan-per-skript-körningsmodell, och det faktum att Zend Engine är en tolk, leder till ineffektivitet; Som ett resultat har olika produkter utvecklats för att förbättra PHP -prestanda. För att påskynda körningstiden och inte behöva kompilera PHP -källkoden varje gång webbsidan öppnas kan PHP -skript också distribueras i PHP -motorens interna format med hjälp av en opcode -cache, som fungerar genom att cachelagra den kompilerade formen för ett PHP -skript (opkoder) i delat minne för att undvika omkostnader att analysera och sammanställa koden varje gång skriptet körs. En opcode -cache, Zend Opcache , är inbyggd i PHP sedan version 5.5. Ett annat exempel på en ofta använt opcode -cache är Alternative PHP Cache (APC), som finns som PECL -tillägg .

Även om Zend PHP fortfarande är den mest populära implementeringen har flera andra implementeringar utvecklats. Några av dessa är kompilatorer eller stöder JIT -kompilering , och erbjuder därför prestandafördelar jämfört med Zend PHP på bekostnad av att de saknar full PHP -kompatibilitet. Alternativa implementeringar inkluderar följande:

  • HHVM (HipHop Virtual Machine)-utvecklat på Facebook och tillgängligt som öppen källkod, det konverterar PHP-kod till en högkodad bytekod (allmänt känd som ett mellanspråk ), som sedan översätts till x86-64 maskinkod dynamiskt vid körning av en just-in-time (JIT) kompilator, vilket resulterar i upp till 6 × prestandaförbättringar. Men sedan version 7.2 har Zend gått bättre än HHVM och HHVM 3.24 är den sista versionen som officiellt stöder PHP.
  • Papegoja  - en virtuell maskin utformad för att köra dynamiska språk effektivt; Pipp omvandlar PHP -källkoden till Parrot -mellanrepresentationen , som sedan översätts till papegojens bytekod och körs av den virtuella maskinen.
  • PeachPie- en andra generationens kompilator till. NET -bytekod ( Common Intermediate Language (CIL)), byggd på Roslyn -plattformen; efterträdare till Phalanger och delar flera arkitektoniska komponenter
  • Phalanger  - sammanställer PHP till bytekod för Common Intermediate Language (CIL); föregångare till PeachPie
  • Quercus  - sammanställer PHP till Java -bytekod
  • HipHop  - utvecklat på Facebook och tillgängligt som öppen källkod, det omvandlar PHP -skripten till C ++ - kod och kompilerar sedan den resulterande koden, vilket minskar serverbelastningen upp till 50%. I början av 2013 avskedade Facebook det till förmån för HHVM på grund av flera skäl, inklusive implementeringssvårigheter och brist på stöd för hela PHP -språket, inklusive create_function()och eval()-konstruktioner.

Licensiering

PHP är gratis programvara som släpps under PHP -licensen , som föreskriver att:

Produkter som härrör från denna programvara får inte kallas "PHP", och "PHP" får inte visas i deras namn, utan föregående skriftligt tillstånd från group@php.net. Du kan ange att din programvara fungerar tillsammans med PHP genom att säga " Foo för PHP" istället för att kalla det "PHP Foo" eller "phpfoo".

Denna begränsning av användningen av "PHP" gör PHP -licensen oförenlig med General Public License (GPL), medan Zend -licensen är inkompatibel på grund av en reklamklausul som liknar den för den ursprungliga BSD -licensen .

Utveckling och gemenskap

PHP inkluderar olika kostnadsfria och öppna källbibliotek i sin källdistribution, eller använder dem i resulterande PHP-binära versioner. PHP är i grunden ett Internetmedvetet system med inbyggda moduler för åtkomst till File Transfer Protocol (FTP) -servrar och många databasservrar, inklusive PostgreSQL , MySQL , Microsoft SQL Server och SQLite (som är en inbäddad databas), LDAP -servrar och andra . Många funktioner som är bekanta för C -programmerare, till exempel de i stdio -familjen , finns i standard PHP -versioner.

PHP tillåter utvecklare att skriva tillägg i C för att lägga till funktionalitet till PHP -språket. PHP -tillägg kan sammanställas statiskt till PHP eller laddas dynamiskt vid körning. Många tillägg har skrivits för att lägga till stöd för Windows API , processhantering på Unix-liknande operativsystem , multibyte strängar ( Unicode ), cURL och flera populära komprimeringsformat . Andra PHP -funktioner som görs tillgängliga genom tillägg inkluderar integration med IRC , dynamisk bildgenerering och Adobe Flash -innehåll, PHP Data Objects (PDO) som ett abstraktionslager som används för åtkomst till databaser och till och med talsyntes . Några av språkets kärnfunktioner, till exempel de som handlar om strängar och matriser, implementeras också som tillägg. Den PHP Extension Community Library (PECL) projekt är en förvaringsplats för tillägg till PHP.

Några andra projekt, såsom Zephir , ger möjlighet för PHP extensions skapas i ett högnivåspråk och sammanställs i infödda PHP extensions. Ett sådant tillvägagångssätt, i stället för att skriva PHP -tillägg direkt i C, förenklar utvecklingen av tillägg och minskar den tid som krävs för programmering och testning.

I december 2018 bestod PHP -gruppen av tio personer: Thies C. Arntzen , Stig Bakken , Shane Caraveo , Andi Gutmans , Rasmus Lerdorf , Sam Ruby , Sascha Schumann , Zeev Suraski , Jim Winstead och Andrei Zmievski .

Zend Technologies tillhandahåller en PHP -certifiering baserad på PHP 7 -tentamen (och tidigare baserad på PHP 5.5) för programmerare att bli certifierade PHP -utvecklare.

Installation och konfiguration

Exempel på utdata från funktionen phpinfo () i PHP 7.1

Det finns två primära sätt att lägga till stöd för PHP till en webbserver - som en inbyggd webbservermodul eller som en CGI -körbar. PHP har ett direkt modulgränssnitt som kallas Server Application Programming Interface (SAPI), som stöds av många webbservrar, inklusive Apache HTTP -server , Microsoft IIS , Netscape (nu nedlagd) och iPlanet . Vissa andra webbservrar, till exempel OmniHTTPd, stöder Internet Server Application Programming Interface (ISAPI), som är ett Microsofts webbservermodulgränssnitt. Om PHP inte har något modulstöd för en webbserver kan den alltid användas som en Common Gateway Interface (CGI) eller FastCGI -processor; i så fall är webbservern konfigurerad att använda PHP: s CGI -körbara för att behandla alla förfrågningar till PHP -filer.

PHP-FPM (FastCGI Process Manager) är en alternativ FastCGI-implementering för PHP, tillsammans med den officiella PHP-distributionen sedan version 5.3.3. Jämfört med den äldre FastCGI -implementeringen innehåller den några ytterligare funktioner, mest användbara för tungt laddade webbservrar.

När du använder PHP för kommandoradsskript krävs en PHP- kommandoradsgränssnitt (CLI) körbar. PHP stöder ett CLI -serverprogrammeringsgränssnitt (SAPI) sedan PHP 4.3.0. Huvudfokus för denna SAPI är att utveckla skalprogram med PHP. Det finns ganska många skillnader mellan CLI SAPI och andra SAPI, även om de delar många av samma beteenden.

PHP har ett direkt modulgränssnitt som kallas SAPI för olika webbservrar; för PHP 5 och Apache 2.0 på Windows tillhandahålls den i form av en DLL -fil som heter php5apache2.dll , som är en modul som bland annat tillhandahåller ett gränssnitt mellan PHP och webbservern, implementerad i en form som servern förstår. Denna form är vad som kallas en SAPI.

Det finns olika sorters SAPI för olika webbservertillägg. Till exempel, förutom de som anges ovan, inkluderar andra SAPI: er för PHP-språket Common Gateway Interface (CGI) och kommandoradsgränssnitt (CLI).

PHP kan också användas för att skriva desktop grafiska användargränssnitt (GUI) applikationer, med PHP-GTK- tillägget. PHP-GTK ingår inte i den officiella PHP-distributionen, och som förlängning kan den endast användas med PHP-versioner 5.1.0 och nyare. Det vanligaste sättet att installera PHP-GTK är att kompilera det från källkoden.

När PHP installeras och används i molnmiljöer, mjukvaruutveckling satser är (SDK) som för att använda moln särdrag. Till exempel:

Många konfigurationsalternativ stöds, vilket påverkar både grundläggande PHP -funktioner och tillägg. Konfigurationsfil php.inisöks efter på olika platser, beroende på hur PHP används. Konfigurationsfilen är uppdelad i olika sektioner, medan några av konfigurationsalternativen också kan ställas in i webbserverkonfigurationen.

Använda sig av

En bred översikt över LAMP -mjukvarupaketet, som visas här tillsammans med Squid

PHP är ett skriptspråk för allmänna ändamål som är särskilt lämpligt för webbutvecklingserversidan , i vilket fall PHP körs i allmänhet på en webbserver . Varje PHP -kod i en begärd fil körs av PHP -körtiden, vanligtvis för att skapa dynamiskt webbsidainnehåll eller dynamiska bilder som används på webbplatser eller någon annanstans. Den kan också användas för kommandoraden scripting och klientsidans grafiskt användargränssnitt applikationer (GUI). PHP kan distribueras på de flesta webbservrar, många operativsystem och plattformar och kan användas med många relationsdatabashanteringssystem (RDBMS). De flesta webbhotellleverantörer stöder PHP för användning av sina kunder. Den är tillgänglig gratis, och PHP -gruppen tillhandahåller den fullständiga källkoden för användare att bygga, anpassa och utöka för eget bruk.

Dynamisk webbsida: exempel på skript på serversidan (PHP och MySQL)

Ursprungligen utformad för att skapa dynamiska webbsidor fokuserar PHP nu främst på serversidan scripting , och det liknar andra server-side skriptspråk som ger dynamiskt innehåll från en webbserver till en kund , till exempel Microsoft 's ASP.NET , Sun Microsystems ' Javaserver Pages och mod_perl. PHP har också dragit till sig utvecklingen av många programvaruramar som tillhandahåller byggstenar och en designstruktur för att främja snabb applikationsutveckling (RAD). Några av dessa inkluderar PRADO , CakePHP , Symfony , CodeIgniter , Laravel , Yii Framework , Phalcon och Laminas , som erbjuder funktioner som liknar andra webbramar .

Den LAMP arkitektur har blivit populär på webben industrin som ett sätt att distribuera webbapplikationer. PHP används vanligtvis som P i detta paket tillsammans med Linux , Apache och MySQL , även om P också kan referera till Python , Perl eller någon blandning av de tre. Liknande paket, WAMP och MAMP , är också tillgängliga för Windows och macOS , där den första bokstaven står för respektive operativsystem. Även om både PHP och Apache tillhandahålls som en del av macOS -basinstallationen, söker användare av dessa paket en enklare installationsmekanism som lättare kan hållas uppdaterad.

För specifika och mer avancerade användningsscenarier erbjuder PHP ett väldefinierat och dokumenterat sätt att skriva anpassade tillägg i C eller C ++ . Förutom att utöka själva språket i form av ytterligare bibliotek , ger tillägg ett sätt att förbättra körhastigheten där det är kritiskt och det finns utrymme för förbättringar genom att använda ett riktigt sammanställt språk . PHP erbjuder också väldefinierade sätt att bädda in sig i andra programvaruprojekt. På så sätt kan PHP enkelt användas som ett internt skriptspråk för ett annat projekt, vilket också ger ett nära gränssnitt med projektets specifika interna datastrukturer .

PHP fick blandade recensioner på grund av att det saknade stöd för multithreading på kärnans språknivå, men det är möjligt att använda trådar med "pthreads" PECL -tillägg .

Ett kommandoradsgränssnitt, php-cli och två ActiveX Windows Script Host- skriptmotorer för PHP har tagits fram.

Popularitets- och användningsstatistik

PHP används för webbhanteringssystem inklusive MediaWiki , WordPress , Joomla , Drupal , Moodle , eZ Publish , eZ Platform och SilverStripe .

Webbplatser som använder PHP inkluderar Facebook , Digg , Dailymotion och Tumblr .

Från och med januari 2013 användes PHP på mer än 240 miljoner webbplatser (39% av de urval) och installerades på 2,1 miljoner webbservrar .

I mars 2021 användes PHP som programmeringsspråk på serversidan på 79,1% av webbplatserna, ner från 83,5% tidigare, där språket kunde fastställas, och PHP 7 är den mest använda versionen av språket med 50,3% av alla webbplatser på webben använder den versionen.

säkerhet

År 2019 var 11% av alla sårbarheter som listas av National Vulnerability Database länkade till PHP; historiskt sett är cirka 30% av alla sårbarheter som listats sedan 1996 i denna databas länkade till PHP. Tekniska säkerhetsbrister i själva språket eller dess kärnbibliotek är inte vanliga (22 år 2009, cirka 1% av det totala, även om PHP gäller för cirka 20% av listade program). I erkännande av att programmerare gör misstag, inkluderar vissa språk färgkontroll för att automatiskt upptäcka bristen på ingångsvalidering som orsakar många problem. En sådan funktion utvecklas för PHP, men dess införande i en version har avvisats flera gånger tidigare.

Det finns avancerade skydds patchar som Suhosin och Härdning -Patch, speciellt utformade för webbhotell miljöer.

Historiskt sett hade gamla versioner av PHP vissa konfigurationsparametrar och standardvärden för sådana körtidsinställningar som gjorde vissa PHP -applikationer benägna att säkerhetsproblem. Bland dessa magic_quotes_gpcoch register_globalskonfigurationsdirektiven var de mest kända; den senare fick alla URL -parametrar att bli PHP -variabler, vilket öppnade en väg för allvarliga säkerhetsproblem genom att låta en angripare ställa in värdet på en oinitialiserad global variabel och störa körningen av ett PHP -skript. Stöd för inställningar för " magiska citat " och "registrera globaler" har tagits bort sedan PHP 5.3.0 och har tagits bort från PHP 5.4.0.

Ett annat exempel på den potentiella sårbarheten för runtime-inställningar kommer från att inte inaktivera PHP-körning (till exempel genom att använda enginekonfigurationsdirektivet) för katalogen där överförda filer lagras; aktivera det kan resultera i körning av skadlig kod inbäddad i de uppladdade filerna. Den bästa praxisen är att antingen lokalisera bildkatalogen utanför dokumentroten som är tillgänglig för webbservern och servera den via mellanhandskript, eller inaktivera PHP -körning för katalogen som lagrar de överförda filerna.

Att aktivera dynamisk laddning av PHP -tillägg (via enable_dlkonfigurationsdirektiv) i en delad webbhotellmiljö kan också leda till säkerhetsproblem.

Underförstådda typkonverteringar som resulterar i att olika värden behandlas som lika, ibland mot programmerarens avsikt, kan leda till säkerhetsproblem. Resultatet av jämförelsen '0e1234' == '0'är till exempel true, eftersom strängar som kan tolkas som tal konverteras till tal; i detta fall behandlas det första jämförda värdet som en vetenskaplig notering som har värdet (0 × 10 1234 ), vilket är noll. Fel som detta resulterade i autentiseringsproblem i Simple Machines Forum , Typo3 och phpBB när MD5 -lösenordshashar jämfördes. Det rekommenderade sättet är att använda hash_equals () (för tidsangreppssäkerhetsattack ) strcmpeller identitetsoperatören ( ===), vilket '0e1234' === '0'resulterar i false.

I en analys från 2013 av över 170 000 webbplatsdefekter , publicerade av Zone-H , var den vanligaste (53%) tekniken utnyttjande av sårbarhet för filintegrering , mestadels relaterad till osäker användning av PHP-språkkonstruktioner include, requireoch allow_url_fopen.

I april 2021 rapporterar W3Techs att 64% av webbplatser som använder PHP använder version 7.2 eller äldre (som inte längre stöds av PHP Development Team) med 35% av alla PHP -webbplatser som använder version 5.6 eller äldre.

Version 5 används fortfarande av 24,5% av alla webbplatser (september 2021). Det rekommenderas starkt att migrera till PHP version 7 eller 8 och använda random_int () istället för rand () eller mt_rand (). Det finns två attacker som kan utföras över PHP -entropikällor: "Seed Attack" och "State recovery attack". Med nuvarande GPU -teknik kan en angripare utföra upp till 2^30 MD5 -beräkningar per sekund med en $ 250 GPU, medan med ytterligare $ 500 kan nå upp till 2^32 beräkningar. I kombination med " Birthday attack " kan detta leda till allvarliga säkerhetsproblem.

Se även

Referenser

Vidare läsning

Lyssna på denna artikel ( 35 minuter )
Talad Wikipedia -ikon
Denna ljudfil skapades från en översyn av denna artikel av den 23 november 2011 och återspeglar inte senare ändringar. ( 2011-11-23 )

externa länkar