PHP - PHP
Paradigme | Multiparadigme : imperativ , funksjonell , objektorientert , prosessuell , reflekterende |
---|---|
Designet av | Rasmus Lerdorf |
Utvikler | PHP Development Team, Zend Technologies |
Første gang dukket opp | 8. juni 1995 |
Stabil utgivelse | |
Forhåndsvis utgivelse | |
Skrive disiplin |
Dynamisk , svak
siden versjon 7.0: Gradvis |
Gjennomføringsspråk | C (først og fremst; noen komponenter C ++ ) |
OS | Unix-lignende , Windows , macOS , IBM i , OpenVMS |
Tillatelse | PHP -lisens (det meste av Zend -motoren under Zend Engine -lisensen ) |
Filnavnutvidelser |
.php , .phar , .phtml , .pht ,.phps
|
Nettsted |
www |
Store implementeringer | |
Zend Engine , HHVM , PeachPie , Quercus , Papegøye | |
Påvirket av | |
Perl , HTML , C , C ++ , Java , Tcl , JavaScript , Hack | |
Påvirket | |
Hack , JSP , ASP | |
|
PHP er et skriptspråk for generelle formål som er rettet mot webutvikling . Den ble opprinnelig opprettet av den dansk-kanadiske programmereren Rasmus Lerdorf i 1994. PHP- referanseimplementeringen er nå produsert av The PHP Group. PHP sto opprinnelig for Personal Home Page , men det står nå for den rekursive initialismen PHP: Hypertext Preprocessor .
PHP -kode behandles vanligvis på en webserver av en PHP -tolk implementert som en modul , en demon eller som en Common Gateway Interface (CGI) kjørbar. På en webserver ville resultatet av den tolket og utførte PHP -koden - som kan være hvilken som helst type data, for eksempel generert HTML eller binære bildedata - danne hele eller deler av et HTTP -svar. Forskjellige nett malsystemer , web- innhold styringssystemer , og webrammeverk eksisterer som kan bli anvendt for å organisere eller lette genereringen av nevnte reaksjon. I tillegg kan PHP brukes til mange programmeringsoppgaver utenfor nettkonteksten, for eksempel frittstående grafiske applikasjoner og robotisk dronekontroll . PHP -kode kan også kjøres direkte fra kommandolinjen .
Standard PHP -tolk, drevet av Zend Engine , er gratis programvare utgitt under PHP -lisensen . PHP har blitt mye portet og kan distribueres på de fleste webservere på en rekke operativsystemer og plattformer .
PHP -språket utviklet seg uten en skriftlig formell spesifikasjon eller standard frem til 2014, med den opprinnelige implementeringen som de facto -standarden som andre implementeringer hadde som mål å følge. Siden 2014 har arbeidet med å lage en formell PHP -spesifikasjon pågått.
W3Techs rapporterer at fra april 2021 brukes "PHP av 79,2% av alle nettstedene hvis programmeringsspråk vi har på serversiden."
Historie
Tidlig historie
PHP -utvikling begynte i 1994 da Rasmus Lerdorf skrev flere Common Gateway Interface (CGI) programmer i C , som han brukte for å opprettholde sin personlige hjemmeside . Han utvidet dem til å jobbe med webskjemaer og til å kommunisere med databaser , og kalte denne implementeringen "Personal Home Page/Forms Interpreter" eller PHP/FI.
PHP/FI kan brukes til å bygge enkle, dynamiske webapplikasjoner . For å akselerere feilrapportering og forbedre koden kunngjorde Lerdorf først utgivelsen av PHP/FI som "Personal Home Page Tools (PHP Tools) versjon 1.0" på Usenet diskusjonsgruppe comp.infosystems.www.authoring.cgi 8. juni 1995 . Denne versjonen hadde allerede den grunnleggende funksjonaliteten som PHP har i dag. Dette inkluderte Perl-lignende variabler , skjemahåndtering og muligheten til å bygge inn HTML . Den syntaks lignet som Perl , men var enklere, mer begrenset og mindre konsekvent.
Et eksempel på den tidlige PHP -syntaksen :
<!--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-->
Tidlig PHP var ikke ment å være et nytt programmeringsspråk , og vokste organisk, med Lerdorf som sa i ettertid: "Jeg vet ikke hvordan jeg skal stoppe det, det var aldri noen intensjon om å skrive et programmeringsspråk [...] Jeg har har ingen anelse om hvordan jeg skal skrive et programmeringsspråk, jeg fortsatte å legge til det neste logiske trinnet på veien. " Et utviklingsteam begynte å danne, og etter måneders arbeid og betatesting ga PHP/FI 2 offisielt ut i november 1997.
Det faktum at PHP ikke opprinnelig ble designet, men i stedet ble utviklet organisk, har ført til inkonsekvent navngivning av funksjoner og inkonsekvent rekkefølge av parametrene. I noen tilfeller ble funksjonsnavnene valgt for å matche bibliotekene på lavere nivå som PHP "pakket", mens i noen veldig tidlige versjoner av PHP ble lengden på funksjonsnavnene brukt internt som en hashfunksjon , så navn ble valgt for å forbedre fordelingen av hashverdier .
PHP 3 og 4
Zeev Suraski og Andi Gutmans skrev om parseren i 1997 og dannet grunnlaget for PHP 3, og endret språkets navn til det rekursive akronymet PHP: Hypertext Preprocessor . Etterpå begynte offentlig testing av PHP 3, og den offisielle lanseringen kom i juni 1998. Suraski og Gutmans startet deretter en ny omskriving av PHPs kjerne, og produserte Zend Engine i 1999. De grunnla også Zend Technologies i Ramat Gan , Israel .
Mai 2000 ble PHP 4, drevet av Zend Engine 1.0, utgitt. I august 2008 hadde denne grenen nådd versjon 4.4.9. PHP 4 er nå ikke lenger under utvikling, og det er heller ikke planlagt noen sikkerhetsoppdateringer.
PHP 5
Juli 2004 ble PHP 5 utgitt, drevet av den nye Zend Engine II. PHP 5 inkluderte nye funksjoner som forbedret støtte for objektorientert programmering , utvidelsen PHP Data Objects (PDO) (som definerer et lett og konsistent grensesnitt for tilgang til databaser) og mange ytelsesforbedringer. I 2008 ble PHP 5 den eneste stabile versjonen under utvikling. Sen statisk binding hadde manglet fra tidligere versjoner av PHP, og ble lagt til i versjon 5.3.
Mange høyprofilerte åpen kildekode-prosjekter sluttet å støtte PHP 4 i ny kode fra 5. februar 2008, på grunn av GoPHP5-initiativet, levert av et konsortium av PHP-utviklere som promoterer overgangen fra PHP 4 til PHP 5.
Over tid ble PHP-tolker tilgjengelige på de fleste eksisterende 32-biters og 64-biters operativsystemer, enten ved å bygge dem fra PHP-kildekoden, eller ved å bruke forhåndsbygde binære filer. For PHP-versjonene 5.3 og 5.4 var de eneste tilgjengelige Microsoft Windows- binære distribusjonene 32-biters IA-32- builds, som krever Windows 32-biters kompatibilitetsmodus mens du bruker Internet Information Services (IIS) på en 64-biters Windows-plattform. PHP versjon 5.5 gjorde 64-biters x86-64- buildene tilgjengelige for Microsoft Windows.
Offisiell sikkerhetsstøtte for PHP 5.6 ble avsluttet 31. desember 2018.
PHP 6 og Unicode
PHP mottok blandede anmeldelser på grunn av manglende innfødt Unicode -støtte på kjernespråknivå. I 2005 ble et prosjekt ledet av Andrei Zmievski initiert for å bringe innfødt Unicode- støtte i hele PHP, ved å bygge inn International Components for Unicode (ICU) bibliotek, og representere tekststrenger som UTF-16 internt. Siden dette ville føre til store endringer både i språkets indre og i brukerkoden, var det planlagt å slippe dette som versjon 6.0 av språket, sammen med andre viktige funksjoner som da var under utvikling.
Imidlertid førte mangel på utviklere som forsto de nødvendige endringene og ytelsesproblemer som følge av konvertering til og fra UTF-16, som sjelden brukes i nettsammenheng, til forsinkelser i prosjektet. Som et resultat ble en PHP 5.3-utgivelse opprettet i 2009, med mange ikke-Unicode-funksjoner som er bakportert fra PHP 6, særlig navneplasser. I mars 2010 ble prosjektet i sin nåværende form offisielt forlatt, og det ble utarbeidet en PHP 5.4-versjon som inneholdt de fleste gjenværende ikke-Unicode-funksjonene fra PHP 6, for eksempel egenskaper og ombinding av nedleggelse. De første håpene var at det skulle dannes en ny plan for Unicode -integrasjon, men innen 2014 var ingen vedtatt.
PHP 7
I løpet av 2014 og 2015 ble en ny stor PHP -versjon utviklet, PHP 7. Nummereringen av denne versjonen innebar en del debatt blant interne utviklere. Selv om PHP 6 Unicode -eksperimentet aldri hadde blitt utgitt, refererte flere artikler og boktitler til PHP 6 -navnet, noe som kan ha forårsaket forvirring hvis en ny utgivelse skulle gjenbruke navnet. Etter en avstemning ble navnet PHP 7 valgt.
Grunnlaget for PHP 7 er et PHP gren som opprinnelig ble kalt PHP neste generasjon ( phpng ). Den ble skrevet av Dmitry Stogov, Xinchen Hui og Nikita Popov, og hadde som mål å optimalisere PHP-ytelsen ved å ombygge Zend-motoren samtidig som den beholder nesten fullstendig språkkompatibilitet. I løpet av 14. juli 2014 viste WordPress -baserte benchmarks, som fungerte som den viktigste referansepakken for phpng -prosjektet, en nesten 100% økning i ytelsen. Endringer fra phpng gjør det lettere å forbedre ytelsen i fremtidige versjoner, ettersom mer kompakte datastrukturer og andre endringer blir sett på som bedre egnet for en vellykket migrering til en just-in-time (JIT) kompilator. På grunn av de betydelige endringene ble den omarbeidede Zend Engine kalt Zend Engine 3 , etterfulgt av Zend Engine 2 som ble brukt i PHP 5.
På grunn av de store interne endringene i phpng, må den motta et nytt større versjonsnummer av PHP, i stedet for en mindre PHP 5 -utgivelse, i henhold til PHPs utgivelsesprosess. Store versjoner av PHP har lov til å bryte bakoverkompatibilitet av kode, og derfor presenterte PHP 7 en mulighet for andre forbedringer utover phpng som krever bakoverkompatibilitetsbrudd. Spesielt innebar det følgende endringer:
- Mange dødelige eller gjenopprettbare nivå eldre PHP-feilmekanismer ble erstattet med moderne objektorienterte unntak .
- Syntaksen for variable dereferencing ble bearbeidet for å være internt mer ensartet og fullstendig, noe som tillater bruk av operatørene
->
,[]
,()
,{}
, og::
, med vilkårlige meningsfulle venstre-side-uttrykk. - Støtte for eldre PHP 4-stil konstruktormetoder ble avviklet.
- Oppførselen til
foreach
uttalelsen ble endret til å være mer forutsigbar. - Konstruktører for de få klassene innebygd i PHP som returnerte null ved feil ble endret for å kaste et unntak i stedet, for konsistens.
- Flere ikke -vedlikeholdte eller utdaterte serverprogrammeringsgrensesnitt (SAPI) og utvidelser ble fjernet fra PHP -kjernen, særlig den eldre
mysql
utvidelsen. list()
Operatørens oppførsel ble endret for å fjerne støtte for strenger.- Støtte ble fjernet for eldre ASP-stil avgrensere
<%
og%>
og<script language="php"> ... </script>
. - Et tilsyn som tillot en bytteerklæring å ha flere
default
klausuler ble løst. - Støtte for heksadesimalt tallstøtte i noen implisitte konverteringer fra strenger til talltyper ble fjernet.
- De venstre-shift og høyre shift operatører ble endret til å oppføre seg mer konsekvent på tvers av plattformer.
- Konverteringer mellom flytende tall og heltall ble endret (f.eks. Uendelig endret for å konvertere til null) og implementert mer konsekvent på tvers av plattformer.
PHP 7 inkluderte også nye språkfunksjoner. Spesielt introduserte den returtypedeklarasjoner for funksjoner som utfyller de eksisterende parametertypedeklarasjonene, og støtte for skalartypene (heltall, float, streng og boolsk) i parameter- og returtypedeklarasjoner.
PHP 8
PHP 8 ble utgitt 26. november 2020. PHP 8 er en hovedversjon og har store endringer fra tidligere versjoner. Nye funksjoner og bemerkelsesverdige endringer inkluderer:
Samling akkurat i tide
Just-in-time-kompilering støttes i PHP 8.
PHP 8s JIT -kompilator kan gi betydelige ytelsesforbedringer for noen brukstilfeller. PHP-utvikler Nikita Popov har uttalt at ytelsesforbedringene for de fleste nettsteder vil være mindre vesentlige enn oppgraderingen fra PHP 5 til PHP 7. Ytelsesforbedringer på grunn av tillegg av JIT-kompilatoren forventes å være større for matematiske operasjoner enn for vanlige bruksområder for webutvikling. I tillegg gir JIT -kompilatoren fremtidig potensial til å flytte noen kode fra C til PHP, på grunn av ytelsesforbedringene for noen brukstilfeller.
Tilsetning av matchuttrykket
PHP 8 introduserte match
uttrykket. Matchuttrykket ligner konseptuelt på en switch
uttalelse og er mer kompakt for noen brukstilfeller. Fordi det match
er et uttrykk, kan resultatet bli fanget inn i en variabel eller returneres fra en funksjon.
Skriv endringer og tillegg
PHP 8 introduserte fagforeningstyper, en ny static
returtype og en ny mixed
type.
"Attributter", ofte referert til som "merknader" på andre programmeringsspråk, ble lagt til i PHP 8, som gjør at metadata kan legges til klasser.
throw
ble endret fra å være et utsagn til å være et uttrykk. Dette gjør at unntak kan kastes på steder som ikke tidligere var mulig.
Syntaksendringer og tillegg
PHP 8 inkluderer endringer for å tillate alternative, mer konsise eller mer konsistente syntakser i en rekke scenarier. For eksempel ligner nullsafe -operatøren på null coalescing -operatøren ??
, men brukes når du ringer til metoder. Følgende kodebit vil ikke gi en feil hvis getBirthday()
null returneres:
$human_readable_date = $user->getBirthday()?->diffForHumans();
Konstruktør egenskap fremming er lagt til som " syntetisk sukker ," slik at klasseegenskaper som skal stilles inn automatisk når parametrene blir ført inn i en klasse konstruktør . Dette reduserer mengden kokerplate -kode som må skrives.
Andre mindre endringer inkluderer støtte for bruk av ::class
objekter, som fungerer som et alternativ for bruk av get_class()
; fangst som ikke fanges opp i prøveblokker; variabel syntaksjustering for å løse inkonsekvenser; støtte for navngitte argumenter; og støtte for etterfølgende kommaer i parameterlister, noe som gir konsistens med støtte for etterfølgende kommaer i andre sammenhenger, for eksempel i matriser.
Standard bibliotekendringer og tillegg
- Svake kart ble lagt til i PHP 8. A
WeakMap
inneholder referanser til objekter, men disse referansene forhindrer ikke at slike gjenstander samles søppel . Dette kan gi ytelsesforbedringer i scenarier der data blir bufret ; Dette er spesielt relevant for ORM . - Ulike justeringer av grensesnitt, for eksempel å legge til støtte for å lage
DateTime
objekter fra grensesnitt, og tillegg av etStringable
grensesnitt som kan brukes til typetips. - Ulike nye funksjoner, inkludert str_contains (), str_starts_with () og str_ends_with (); fdiv (); get_debug_type (); og get_resource_id ()
- Objektimplementering av token_get_all ()
Ytterligere endringer
- Typeanmerkninger ble også lagt til i PHPs C -kildekode i seg selv for å tillate interne funksjoner og metoder å ha "komplett typeinformasjon i refleksjon."
- Arv med private metoder
- Abstrakte metoder i trekkforbedringer
Utgivelseshistorikk
Versjon | Utgivelsesdato | Støttes til | Merknader |
---|---|---|---|
1.0 | 8. juni 1995 | Offisielt kalt "Personal Home Page Tools (PHP Tools)". Dette er den første bruken av navnet "PHP". | |
2.0 | 1. november 1997 | Offisielt kalt "PHP/FI 2.0". Dette er den første utgivelsen som faktisk kan karakteriseres som PHP, og er et frittstående språk med mange funksjoner som har holdt ut til i dag. | |
3.0 | 6. juni 1998 | 20. oktober 2000 | Utvikling går fra én person til flere utviklere. Zeev Suraski og Andi Gutmans omskriver basen for denne versjonen. |
4.0 | 22. mai 2000 | 23. juni 2001 | Lagt til mer avansert totrinns parse/utfør tag-parsing-system kalt Zend-motoren. |
4.1 | 10. desember 2001 | 12. mars 2002 | Introdusert "superglobals" ( $_GET , $_POST , $_SESSION , etc.)
|
4.2 | 22. april 2002 | 6. september 2002 | Deaktivert register_globals som standard. Data mottatt over nettverket settes ikke inn direkte i det globale navnerommet lenger, og lukker mulige sikkerhetshull i applikasjoner.
|
4.3 | 27. desember 2002 | 31. mars 2005 | Introduserte kommandolinjegrensesnittet (CLI), for å supplere CGI. |
4.4 | 11. juli 2005 | 7. august 2008 | Rettet en minnekorrupsjonsfeil, som krevde brudd på binær kompatibilitet med utvidelser kompilert mot PHP versjon 4.3.x. |
5.0 | 13. juli 2004 | 5. september 2005 | Zend Engine II med en ny objektmodell. |
5.1 | 24. november 2005 | 24. august 2006 | Ytelsesforbedringer med introduksjon av kompilatorvariabler i omkonstruert PHP Engine. Lagt til PHP Data Objects (PDO) som et konsistent grensesnitt for tilgang til databaser. |
5.2 | 2. november 2006 | 6. januar 2011 | Aktiverte filterutvidelsen som standard. Innfødt JSON -støtte. |
5.3 | 30. juni 2009 | 14. august 2014 | Navneplassstøtte ; sene statiske bindinger , hoppetikett (begrenset goto ), anonyme funksjoner , nedleggelser , PHP -arkiver (phar), søppelsamling for sirkulære referanser, forbedret Windows -støtte, sqlite3, mysqlnd som erstatning for libmysql som underliggende bibliotek for utvidelsene som fungerer med MySQL , filinfo som en erstatning for mime_magic for bedre MIME -støtte, internasjonaliseringsutvidelsen og avskrivning av ereg -utvidelsen. |
5.4 | 1. mars 2012 | 3. september 2015 |
Trait støtte, kort array syntaks støtte. Fjernet elementer: register_globals , safe_mode , allow_call_time_pass_reference , , og . Innebygd webserver. Flere forbedringer av eksisterende funksjoner, ytelse og reduserte minnekrav.
session_register() session_unregister() session_is_registered() |
5.5 | 20. juni 2013 | 10. juli 2016 | Støtte for generatorer , finally blokker for unntakshåndtering, OpCache (basert på Zend Optimizer+) samlet i offisiell distribusjon.
|
5.6 | 28. august 2014 | 31. desember 2018 | Konstant skalaruttrykk , variadiske funksjoner , pakking av argumenter, ny eksponentieringsoperatør, utvidelser av use setningen for funksjoner og konstanter, ny phpdbg debugger som en SAPI -modul og andre mindre forbedringer.
|
6.x | Ikke utgitt | Ikke tilgjengelig | Forlatt versjon av PHP som planla å inkludere native Unicode -støtte. |
7,0 | 3. desember 2015 | 10. januar 2019 | Zend motor 3 (ytelsesforbedringer og 64-bits heltall støtte for Windows), uniform variable syntaks, AST -baserte kompileringsprosessen, tilsatt , bitvis skift konsistens på tvers av plattformer, ( null koalescere ) operatoren, Unicode kodepunkt unnslippe syntaks , returtype erklæringer, skalertype (heltall, float, string og boolsk) deklarasjoner, "romskip" treveis sammenligningsoperator , generatordelegering , anonyme klasser , enklere og mer konsekvent tilgjengelig CSPRNG API, erstatning av mange gjenværende interne PHP "feil" med de mer moderne unntakene , og stenografi syntaks for import av flere elementer fra et navneområde.
Closure::call() ?? <=> |
7.1 | 1. desember 2016 | 1. desember 2019 | ugyldig returtype , endringer i konstant konstant synlighet |
7.2 | 30. november 2017 | 30. november 2020 | Objektparameter og returtypedeklarasjon, Libsodium -forlengelse, abstrakt metodeoverstyring, utvidelse av parametertype |
7.3 | 6. desember 2018 | 6. desember 2021 | Fleksibel Heredoc- og Nowdoc -syntaks, støtte for referanseoppgave og matrisedekonstruksjon med liste (), PCRE2 -støtte, hrtime () -funksjon |
7.4 | 28. november 2019 | 28. november 2022 | Typede egenskaper 2.0, forhåndsinnlasting, null-koalescerende oppdragsoperatør, forbedrer openssl_random_pseudo_bytes, svake referanser, FFI- grensesnitt for utenlandske funksjoner , alltid tilgjengelig hash-forlengelse, passord-hash-register, multibyte-strengdeling, refleksjon for referanser, unbundle ext/wddx, nytt egendefinert objektserialisering mekanisme |
8.0 | 26. november 2020 | 26. november 2023 | Just-In-Time (JIT) -samling , matriser som starter med en negativ indeks, strengere/fornuftigere språksemantikk (validering for abstrakte trekkmetoder), fornuftig streng til tallsammenligninger, fornuftigere numeriske strenger, TypeError på ugyldige aritmetiske/bitvise operatører, omklassifisering av forskjellige motorfeil, konsekvente typefeil for interne funksjoner, dødelig feil ved inkompatible metodesignaturer), lokaluavhengig float to string-konvertering, variable syntaksjusteringer, attributter, navngitte argumenter, matchuttrykk, konstruktøregenskaper, foreningstyper, blandet type, statisk returtype, nullsikker operatør, ikke-fangende fangster, kasteuttrykk, JSON-forlengelse er alltid tilgjengelig. |
8.1 | 25. november 2021 | ?? November 2024 | Eksplisitt oktalt heltall bokstavelig notasjon, oppregninger |
Legende:
Gammel versjon
Eldre versjon, fortsatt vedlikeholdt
Siste versjon
Siste forhåndsversjon
Fremtidig utgivelse
|
Fra 28. juni 2011 implementerte PHP Development Team en tidslinje for utgivelsen av nye versjoner av PHP. Under dette systemet bør minst én utgivelse skje hver måned. En gang i året bør det forekomme en mindre utgivelse som kan inneholde nye funksjoner. Hver mindre utgivelse bør minst støttes i to år med sikkerhet og feilrettinger, etterfulgt av minst ett år med bare sikkerhetsrettelser, for totalt en treårig utgivelsesprosess for hver mindre utgivelse. Ingen nye funksjoner, med mindre de er små og uavhengige, skal introduseres i en mindre utgave under den treårige utgivelsesprosessen.
Maskot
Maskoten for PHP -prosjektet er elePHPant , en blå elefant med PHP -logoen på siden, designet av Vincent Pontier i 1998. "(PHP) bokstavene dannet formen til en elefant hvis den ble sett i en sidevinkel." ElePHPant er noen ganger annerledes farget når det er i plysjform .
Mange varianter av denne maskoten har blitt gjort gjennom årene. Bare elePHPants basert på det originale designet av Vincent Pontier regnes som offisielle av samfunnet. Disse er samleobjekter, og noen av dem er ekstremt sjeldne.
Syntaks
Følgende "Hei, verden!" programmet er skrevet i PHP -kode innebygd i et HTML -dokument:
<!DOCTYPE html>
<html>
<head>
<title>PHP "Hello, World!" program</title>
</head>
<body>
<?php
echo '<p>Hello, World!</p>';
?>
</body>
</html>
Siden det imidlertid ikke er krav om at PHP -kode skal være innebygd i HTML, den enkleste versjonen av Hello, World! kan skrives slik, med den avsluttende taggen utelatt som foretrukket i filer som inneholder ren PHP -kode
?>
<?php
echo 'Hello, World!';
?>
PHP -tolken utfører bare PHP -kode innenfor sine avgrensere . Alt utenfor avgrensningene blir ikke behandlet av PHP, selv om ikke-PHP-tekst fortsatt er underlagt kontrollstrukturer beskrevet i PHP-kode. De vanligste skilletegnene er <?php
å åpne og lukke PHP -seksjoner. Den forkortede formen finnes også. Denne korte skilletegnet gjør skriptfiler mindre bærbare, siden støtte for dem kan deaktiveres i den lokale PHP -konfigurasjonen og derfor frarådes. Motsatt er det ingen anbefaling mot ekkokort -taggen . Før PHP 5.4.0 fungerer denne korte syntaksen for bare med konfigurasjonsinnstillingen aktivert, mens den for PHP 5.4.0 og nyere alltid er tilgjengelig. Hensikten med alle disse avgrenserne er å skille PHP-kode fra ikke-PHP-innhold, for eksempel JavaScript- kode eller HTML-markering. Så den korteste "Hei, verden!" programmet skrevet i PHP er:
?>
<?
<?=
echo
short_open_tag
<?='Hello, World!';
Den første formen for skilletegn, <?php
og i XHTML og andre XML -dokumenter, skaper korrekt utformede XML -behandlingsinstruksjoner. Dette betyr at den resulterende blandingen av PHP-kode og annen markering i filen på serversiden i seg selv er velformet XML.
?>
Variabler er prefikset med et dollar -symbol , og en type trenger ikke spesifiseres på forhånd. PHP 5 introduserte typedeklarasjoner som gjør at funksjoner kan tvinge parameterne til å være objekter i en bestemt klasse, matriser, grensesnitt eller tilbakeringingsfunksjoner . Men før PHP 7 kunne ikke typeerklæringer brukes med skalartyper som heltall eller streng.
Nedenfor er et eksempel på hvordan PHP -variabler deklareres og initialiseres.
<?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
?>
I motsetning til funksjons- og klassenavn er variabelnavn store og små bokstaver. Både dobbelt siterte ("") og heredoc- strenger gir muligheten til å interpolere en variabels verdi i strengen. PHP behandler newlines som mellomrom på samme måte som et språk i fri form , og utsagn avsluttes med et semikolon. PHP har tre typer kommentarsyntaks : /* */
merker blokkerer og innebygde kommentarer; //
eller #
brukes til kommentarer på en linje. Den echo
uttalelsen er et av flere anlegg PHP gir til utgangsteksten.
Når det gjelder søkeord og språksyntaks, ligner PHP på syntaks i C -stil. if
betingelser for
og while
sløyfer, og funksjonsreturer ligner syntaks på språk som C, C ++, C#, Java og Perl.
Datatyper
PHP er løst skrevet . Den lagrer heltall i et plattformavhengig område, enten som et 32, 64 eller 128-bits signert heltall som tilsvarer den lange C-språketypen . Usignerte heltall konverteres til signerte verdier i visse situasjoner, noe som er annerledes enn mange andre programmeringsspråk. Heltallvariabler kan tildeles ved hjelp av desimal (positiv og negativ), oktal , heksadesimal og binær notasjon.
Flytpunktnumre lagres også i et plattformsspesifikt område. De kan spesifiseres ved hjelp av flytende punktnotasjon, eller to former for vitenskapelig notasjon . PHP har en innfødt boolsk type som ligner de opprinnelige boolske typene i Java og C ++ . Ved å bruke konverteringsreglene for boolsk type, tolkes ikke-nullverdier som sanne og null som usanne, som i Perl og C ++.
Null -datatypen representerer en variabel som ikke har noen verdi; NULL
er den eneste tillatte verdien for denne datatypen.
Variabler av typen "ressurs" representerer referanser til ressurser fra eksterne kilder. Disse opprettes vanligvis av funksjoner fra en bestemt utvidelse, og kan bare behandles av funksjoner fra den samme utvidelsen; eksempler inkluderer fil-, bilde- og databaseressurser.
Arrays kan inneholde elementer av alle typer PHP kan håndtere, inkludert ressurser, objekter og til og med andre matriser. Orden bevares i verdilister og i hashes med både nøkler og verdier, og de to kan blandes inn. PHP støtter også strenger , som kan brukes med enkle anførselstegn, doble anførselstegn, nowdoc eller heredoc syntaks.
The Standard PHP Library (SPL) forsøker å løse vanlige problemer og implementerer effektive datatilgang grensesnitt og klasser.
Funksjoner
PHP definerer et stort utvalg funksjoner på kjernespråket, og mange er også tilgjengelige i forskjellige utvidelser; disse funksjonene er godt dokumentert i den elektroniske PHP -dokumentasjonen . Imidlertid har det innebygde biblioteket et stort utvalg av navnekonvensjoner og tilhørende inkonsekvenser, som beskrevet under historien ovenfor.
Tilpassede funksjoner kan defineres av utvikleren:
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.';
I 2021 er produksjonen av eksempelprogrammet ovenfor "Jeg er for tiden 26 år gammel."
I stedet for funksjonspekere kan funksjoner i PHP refereres til av en streng som inneholder navnet deres. På denne måten kan vanlige PHP -funksjoner brukes, for eksempel som tilbakeringing eller i funksjonstabeller . Brukerdefinerte funksjoner kan opprettes når som helst uten å bli prototypet . Funksjoner kan defineres inne i kodeblokker, noe som gjør det mulig å bestemme om en funksjon skal defineres eller ikke. Det er en function_exists
funksjon som avgjør om en funksjon med et gitt navn allerede er definert. Funksjonsanrop må bruke parenteser, med unntak av konstruktørfunksjoner i nullargumentklasse som kalles med PHP-operatøren new
, i så fall er parenteser valgfrie.
Frem til PHP 5.3 eksisterte det ikke støtte for anonyme funksjoner og nedleggelser i PHP. Selv om det create_function()
har eksistert siden PHP 4.0.1, er det bare en tynn omslag eval()
som gjør at normale PHP -funksjoner kan opprettes under programkjøring. PHP 5.3 la til syntaks for å definere en anonym funksjon eller " avslutning " som kan fange variabler fra det omkringliggende omfanget. Shorthand arrow syntax ble lagt til i PHP 7.4:
function getAdder($x) {
return fn($y) => $x + $y;
}
$adder = getAdder(8);
echo $adder(2); // prints "10"
I eksemplet ovenfor getAdder()
oppretter funksjonen en avslutning ved hjelp av bestått argument $x
(søkeordet use
importerer en variabel fra den leksikale konteksten), som tar et ekstra argument $y
, og returnerer den opprettede lukkingen til den som ringer. En slik funksjon er et førsteklasses objekt, noe som betyr at den kan lagres i en variabel, sendes som parameter til andre funksjoner, etc.
Uvanlig for et dynamisk skrevet språk, støtter PHP typedeklarasjoner om funksjonsparametere, som håndheves ved kjøretid. Dette har blitt støttet for klasser og grensesnitt siden PHP 5.0, for arrays siden PHP 5.1, for "callables" siden PHP 5.4, og skalar (heltall, float, string og boolsk) typer siden PHP 7.0. PHP 7.0 har også typedeklarasjoner for funksjonsreturtyper, uttrykt ved å plassere typenavnet etter listen over parametere, foran et kolon. For eksempel kan getAdder
funksjonen fra det tidligere eksemplet bli kommentert 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ølger skalertypeerklæringer svake skriveprinsipper. Så for eksempel, hvis en parametertype er int
, ville PHP tillate at ikke bare heltall, men også konvertible numeriske strenger, flyter eller booleans sendes til den funksjonen, og konverterer dem. PHP 7 har imidlertid en "streng skrivemodus" som, når den brukes, tillater slike konverteringer for funksjonsanrop og returnerer i en fil.
PHP -objekter
Grunnleggende objektorientert programmeringsfunksjonalitet ble lagt til i PHP 3 og forbedret i PHP 4. Dette tillot PHP å få ytterligere abstraksjon, noe som gjorde kreative oppgaver lettere for programmerere som bruker språket. Objekthåndtering ble fullstendig omskrevet for PHP 5, og utvidet funksjonssettet og forbedret ytelsen. I tidligere versjoner av PHP ble objekter håndtert som verdityper . Ulempen med denne metoden var at koden måtte gjøre stor bruk av PHPs "referanse" -variabler hvis den ville endre et objekt den ble sendt i stedet for å lage en kopi av den. I den nye tilnærmingen refereres objekter til ved håndtak , og ikke etter verdi.
PHP 5 introduserte private og beskyttede medlemsvariabler og metoder, sammen med abstrakte klasser , sluttklasser , abstrakte metoder og siste metoder . Den introduserte også en standard måte å deklarere konstruktører og destruktorer på , lik den for andre objektorienterte språk som C ++ , og en standard unntakshåndteringsmodell . Videre har PHP 5 lagt til grensesnitt og gjort det mulig å implementere flere grensesnitt. Det er spesielle grensesnitt som lar objekter samhandle med kjøretidssystemet. Objekter som implementerer ArrayAccess kan brukes med utvalg syntaks og objekter implementerer Iterator eller IteratorAggregate kan brukes med foreach
konstruksjon i språket . Det er ingen virtuell tabellfunksjon i motoren, så statiske variabler er bundet med et navn i stedet for en referanse ved kompileringstidspunktet.
Hvis utvikleren lager en kopi av et objekt ved hjelp av det reserverte ordet clone
, vil Zend -motoren sjekke om en __clone()
metode er definert. Hvis ikke, vil det kalle en standard __clone()
som vil kopiere objektets egenskaper. Hvis en __clone()
metode er definert, vil den være ansvarlig for å sette de nødvendige egenskapene i det opprettede objektet. For enkelhets skyld vil motoren levere en funksjon som importerer egenskapene til kildeobjektet, slik at programmereren kan starte med en etterverdi- kopi av kildeobjektet og bare overstyre egenskaper som må endres.
Den synlighet av PHP egenskapene og metodene er definert ved hjelp av søkeord public
, private
og protected
. Standarden er offentlig, hvis bare var brukes; var
er et synonym for public
. Elementer som deklareres public
kan nås overalt. protected
begrenser tilgangen til arvede klasser (og til klassen som definerer elementet). private
begrenser synligheten bare til klassen som definerer varen. Objekter av samme type har tilgang til hverandres private og beskyttede medlemmer, selv om de ikke er den samme forekomsten.
Eksempel
Følgende er et grunnleggende eksempel på objektorientert 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
Implementeringer
Den eneste komplette PHP -implementeringen er originalen, bare kjent som PHP. Den er den mest brukte og drives av Zend Engine . For å skille det fra andre implementeringer, kalles det noen ganger uoffisielt "Zend PHP". Zend Engine kompilerer PHP- kildekoden i farten til et internt format som den kan utføre, og fungerer derfor som tolk . Det er også "referanseimplementering" av PHP, ettersom PHP ikke har noen formell spesifikasjon, og derfor definerer semantikken til Zend PHP semantikken i PHP. På grunn av den komplekse og nyanserte semantikken til PHP, definert av hvordan Zend fungerer, er det vanskelig for konkurrerende implementeringer å tilby fullstendig kompatibilitet.
PHPs enkeltforespørsel-per-script-utførelsesmodell, og det faktum at Zend Engine er en tolk, fører til ineffektivitet; Som et resultat har forskjellige produkter blitt utviklet for å forbedre PHP -ytelsen. For å øke hastigheten på utførelsen tid og ikke trenger å kompilere PHP-kildekoden hver gang nettsiden er åpnet, kan PHP-skript også bli utplassert i PHP motorens interne format ved hjelp av en opcode cache, som fungerer ved caching den kompilerte form av et PHP -skript (opcodes) i delt minne for å unngå overhead av analyse og kompilering av koden hver gang skriptet kjøres. En opcode -cache , Zend Opcache , er innebygd i PHP siden versjon 5.5. Et annet eksempel på en mye brukt opcode -cache er Alternative PHP Cache (APC), som er tilgjengelig som en PECL -utvidelse.
Selv om Zend PHP fortsatt er den mest populære implementeringen, har flere andre implementeringer blitt utviklet. Noen av disse er kompilatorer eller støtter JIT -kompilering , og tilbyr derfor ytelsesfordeler i forhold til Zend PHP på bekostning av manglende full PHP -kompatibilitet. Alternative implementeringer inkluderer følgende:
- HHVM (HipHop Virtual Machine) -utviklet på Facebook og tilgjengelig som åpen kildekode, konverterer den PHP-kode til en bytekode på høyt nivå (vanligvis kjent som et mellomspråk ), som deretter blir oversatt til x86-64 maskinkode dynamisk ved kjøretid av en just-in-time (JIT) kompilator, noe som resulterer i opptil 6 × ytelsesforbedringer. Siden versjon 7.2 har Zend imidlertid overgått HHVM, og HHVM 3.24 er den siste versjonen som offisielt støtter PHP.
- Papegøye - en virtuell maskin designet for å kjøre dynamiske språk effektivt; Pipp forvandler PHP -kildekoden til Parrot -mellomrepresentasjonen , som deretter blir oversatt til Papegøyens bytekode og kjørt av den virtuelle maskinen.
- PeachPie -en andre generasjons kompilator til. NET Common Intermediate Language (CIL) bytekode, bygget på Roslyn -plattformen; etterfølger av Phalanger, som deler flere arkitektoniske komponenter
- Phalanger - kompilerer PHP til bytekode for Common Intermediate Language (CIL); forgjengeren til PeachPie
- Quercus - kompilerer PHP til Java bytecode
-
HipHop - utviklet på Facebook og tilgjengelig som åpen kildekode, det transformerer PHP -skriptene til C ++ - kode og kompilerer deretter den resulterende koden, og reduserer serverbelastningen til 50%. Tidlig i 2013 avskrev Facebook det til fordel for HHVM på grunn av flere årsaker, inkludert distribusjonsvansker og mangel på støtte for hele PHP -språket, inkludert
create_function()
ogeval()
-konstruksjonene.
Lisensiering
PHP er gratis programvare utgitt under PHP -lisensen , som bestemmer at:
Produkter som er avledet fra denne programvaren, kan ikke kalles "PHP", og "PHP" kan ikke vises i deres navn, uten forhånds skriftlig tillatelse fra group@php.net. Du kan indikere at programvaren din fungerer sammen med PHP ved å si " Foo for PHP" i stedet for å kalle det "PHP Foo" eller "phpfoo".
Denne begrensningen for bruk av "PHP" gjør PHP -lisensen inkompatibel med General Public License (GPL), mens Zend -lisensen er inkompatibel på grunn av en reklameklausul som ligner den i den opprinnelige BSD -lisensen .
Utvikling og fellesskap
PHP inkluderer forskjellige gratis og åpen kildekode-bibliotek i kildedistribusjonen, eller bruker dem i resulterende PHP-binære bygg. PHP er i utgangspunktet et Internett -bevisst system med innebygde moduler for tilgang til File Transfer Protocol (FTP) -servere og mange databaseservere, inkludert PostgreSQL , MySQL , Microsoft SQL Server og SQLite (som er en innebygd database), LDAP -servere og andre . Mange funksjoner som er kjent for C -programmerere, for eksempel de i stdio -familien, er tilgjengelige i standard PHP -bygg.
PHP lar utviklere skrive utvidelser i C for å legge til funksjonalitet på PHP -språket. PHP -utvidelser kan kompileres statisk til PHP eller lastes dynamisk ved kjøretid. Det er skrevet mange utvidelser for å legge til støtte for Windows API , prosessstyring på Unix-lignende operativsystemer , multibyte-strenger ( Unicode ), cURL og flere populære komprimeringsformater . Andre PHP -funksjoner som er gjort tilgjengelige gjennom utvidelser inkluderer integrasjon med IRC , dynamisk generering av bilder og Adobe Flash -innhold, PHP Data Objects (PDO) som et abstraksjonslag som brukes for tilgang til databaser, og til og med talesyntese . Noen av språkets kjernefunksjoner, for eksempel de som omhandler strenger og matriser, er også implementert som utvidelser. Den PHP Extension Community Library (PECL) Prosjektet er et oppbevaringssted for utvidelser til PHP språket.
Noen andre prosjekter, for eksempel Zephir , gir PHP-utvidelser muligheten til å opprettes på et språk på høyt nivå og kompileres til native PHP-utvidelser. En slik tilnærming, i stedet for å skrive PHP -utvidelser direkte i C, forenkler utviklingen av utvidelser og reduserer tiden som kreves for programmering og testing.
I desember 2018 besto PHP -gruppen av ti personer: Thies C. Arntzen , Stig Bakken , Shane Caraveo , Andi Gutmans , Rasmus Lerdorf , Sam Ruby , Sascha Schumann , Zeev Suraski , Jim Winstead og Andrei Zmievski .
Zend Technologies gir en PHP -sertifisering basert på PHP 7 -eksamen (og tidligere basert på PHP 5.5) for at programmerere skal bli sertifiserte PHP -utviklere.
Installasjon og konfigurasjon
Det er to hovedmåter for å legge til støtte for PHP til en webserver - som en opprinnelig webservermodul, eller som en CGI -kjørbar. PHP har et direkte modulgrensesnitt kalt Server Application Programming Interface (SAPI), som støttes av mange webservere, inkludert Apache HTTP Server , Microsoft IIS , Netscape (nå nedlagt) og iPlanet . Noen andre webservere, for eksempel OmniHTTPd, støtter Internet Server Application Programming Interface (ISAPI), som er et grensesnitt for Microsofts webservermodul. Hvis PHP ikke har modulstøtte for en webserver, kan den alltid brukes som en Common Gateway Interface (CGI) eller FastCGI -prosessor; i så fall er webserveren konfigurert til å bruke PHPs CGI -kjørbare for å behandle alle forespørsler til PHP -filer.
PHP-FPM (FastCGI Process Manager) er en alternativ FastCGI-implementering for PHP, sammen med den offisielle PHP-distribusjonen siden versjon 5.3.3. Sammenlignet med den eldre FastCGI -implementeringen inneholder den noen ekstra funksjoner, for det meste nyttige for tungt belastede webservere.
Når du bruker PHP for kommandolinjeskripting, er et PHP kommandolinjegrensesnitt (CLI) nødvendig. PHP støtter en CLI -server programmeringsgrensesnitt (SAPI) siden PHP 4.3.0. Hovedfokuset for denne SAPI er å utvikle skallprogrammer som bruker PHP. Det er ganske mange forskjeller mellom CLI SAPI og andre SAPI -er, selv om de deler mange av de samme atferdene.
PHP har et direkte modulgrensesnitt kalt SAPI for forskjellige webservere; i tilfelle PHP 5 og Apache 2.0 på Windows, leveres den i form av en DLL -fil kalt php5apache2.dll , som er en modul som blant annet gir et grensesnitt mellom PHP og webserveren, implementert i et skjema som serveren forstår. Dette skjemaet er det som er kjent som en SAPI.
Det finnes forskjellige typer SAPIer for forskjellige webserverutvidelser. For eksempel, i tillegg til de som er oppført ovenfor, inkluderer andre SAPI-er for PHP-språket Common Gateway Interface (CGI) og kommandolinjegrensesnitt (CLI).
PHP kan også brukes til å skrive desktop grafisk brukergrensesnitt (GUI) -programmer, ved å bruke PHP-GTK- utvidelsen. PHP-GTK er ikke inkludert i den offisielle PHP-distribusjonen, og som en utvidelse kan den bare brukes med PHP-versjoner 5.1.0 og nyere. Den vanligste måten å installere PHP-GTK på er å kompilere den fra kildekoden.
Når PHP er installert og brukt i skymiljøer , leveres programvareutviklingssett (SDK) for bruk av skyspesifikke funksjoner. For eksempel:
- Amazon Web Services tilbyr AWS SDK for PHP
- Windows Azure kan brukes med Windows Azure SDK for PHP.
Mange konfigurasjonsalternativer støttes, som påvirker både kjernefunksjoner i PHP og utvidelser. php.ini
Det søkes etter konfigurasjonsfil på forskjellige steder, avhengig av måten PHP brukes på. Konfigurasjonsfilen er delt inn i forskjellige seksjoner, mens noen av konfigurasjonsalternativene også kan angis i webserverkonfigurasjonen.
Bruk
PHP er et skriptspråk for generelle formål som er spesielt egnet for webutvikling på serversiden , i så fall kjører PHP vanligvis på en webserver . Enhver PHP -kode i en forespurt fil utføres av PHP -kjøretiden, vanligvis for å lage dynamisk websideinnhold eller dynamiske bilder som brukes på nettsteder eller andre steder. Den kan også brukes til kommandolinjeskripting og applikasjoner på grafisk brukergrensesnitt (GUI) på klientsiden . PHP kan distribueres på de fleste webservere, mange operativsystemer og plattformer , og kan brukes med mange relasjonelle databasesystemer (RDBMS). De fleste webhotellleverandører støtter PHP for bruk av sine klienter. Den er tilgjengelig gratis, og PHP -gruppen gir den komplette kildekoden for brukere å bygge, tilpasse og utvide til eget bruk.
Opprinnelig utviklet for å lage dynamiske websider , PHP nå fokuserer hovedsakelig på server-side scripting , og det er lik andre server-side skriptspråk som gir dynamisk innhold fra en web server til en klient , for eksempel Microsoft 's ASP.NET , Sun Microsystems ' JavaServer Pages , og mod_perl
. PHP har også tiltrukket seg utviklingen av mange programvare rammer som gir byggeklosser og en designstruktur for å fremme rask applikasjonsutvikling (RAD). Noen av disse inkluderer PRADO , CakePHP , Symfony , CodeIgniter , Laravel , Yii Framework , Phalcon og Laminas , tilby funksjoner som ligner på andre web-rammeverk .
Den LAMP arkitektur har blitt populært i web-bransjen som en måte å distribuere web-applikasjoner. PHP brukes ofte som P i denne pakken sammen med Linux , Apache og MySQL , selv om P også kan referere til Python , Perl eller en blanding av de tre. Lignende pakker, WAMP og MAMP , er også tilgjengelige for Windows og macOS , med den første bokstaven for det respektive operativsystemet. Selv om både PHP og Apache tilbys som en del av macOS -basisinstallasjonen, søker brukere av disse pakkene etter en enklere installasjonsmekanisme som lettere kan holdes oppdatert.
For spesifikke og mer avanserte bruksscenarier, tilbyr PHP en veldefinert og dokumentert måte å skrive tilpassede utvidelser i C eller C ++ . I tillegg til å utvide selve språket i form av flere biblioteker , gir utvidelser en måte å forbedre utførelseshastigheten der det er kritisk, og det er rom for forbedringer ved å bruke et ekte kompilert språk . PHP tilbyr også veldefinerte måter å bygge seg inn i andre programvareprosjekter. På den måten kan PHP enkelt brukes som et internt skriptspråk for et annet prosjekt, og gir også tett grensesnitt med prosjektets spesifikke interne datastrukturer .
PHP mottok blandede anmeldelser på grunn av manglende støtte for multithreading på kjernespråknivå, selv om bruk av tråder er mulig med "pthreads" PECL -utvidelsen.
Et kommandolinjegrensesnitt, php-cli og to ActiveX Windows Script Host- skriptmotorer for PHP er produsert.
Popularitets- og bruksstatistikk
PHP brukes til styring av webinnholdssystemer, inkludert MediaWiki , WordPress , Joomla , Drupal , Moodle , eZ Publish , eZ Platform og SilverStripe .
Nettsteder som bruker PHP inkluderer Facebook , Digg , Dailymotion og Tumblr .
Fra januar 2013 ble PHP brukt på mer enn 240 millioner nettsteder (39% av de utvalgte) og ble installert på 2,1 millioner webservere .
Fra mars 2021 ble PHP brukt som programmeringsspråk på serversiden på 79,1% av nettstedene, ned fra 83,5% tidligere, der språket kunne bestemmes, og PHP 7 er den mest brukte versjonen av språket med 50,3% av alle nettsteder på nettet bruker den versjonen.
Sikkerhet
I 2019 var 11% av alle sårbarhetene som er oppført av National Vulnerability Database knyttet til PHP; Historisk sett er omtrent 30% av alle sårbarhetene som er oppført siden 1996 i denne databasen knyttet til PHP. Tekniske sikkerhetsfeil på selve språket eller i kjernebibliotekene er ikke hyppige (22 i 2009, omtrent 1% av totalen selv om PHP gjelder for omtrent 20% av programmene som er oppført). Noen språk erkjenner at programmerere gjør feil, og inkluderer kontroll av pletter for automatisk å oppdage mangel på inputvalidering som forårsaker mange problemer. En slik funksjon er under utvikling for PHP, men inkludering i en versjon har blitt avvist flere ganger tidligere.
Det er avanserte beskyttelsesoppdateringer som Suhosin og Hardening -Patch, spesielt designet for webhotellmiljøer.
Historisk sett hadde gamle versjoner av PHP noen konfigurasjonsparametere og standardverdier for slike kjøretidsinnstillinger som gjorde noen PHP -applikasjoner utsatt for sikkerhetsproblemer. Blant disse magic_quotes_gpc
og register_globals
konfigurasjonsdirektiver var de mest kjente; sistnevnte fikk alle URL -parametere til å bli PHP -variabler, og åpnet en bane for alvorlige sikkerhetsproblemer ved å la en angriper sette verdien til en ikke -initialisert global variabel og forstyrre utførelsen av et PHP -script. Støtte for " magic quotes " og "register globals" -innstillinger har blitt avskrevet siden PHP 5.3.0 og fjernet fra PHP 5.4.0.
Et annet eksempel på den potensielle sårbarheten for kjøretidsinnstillinger kommer fra at man ikke deaktiverer PHP-kjøring (for eksempel ved å bruke engine
konfigurasjonsdirektivet) for katalogen der opplastede filer lagres; Hvis du aktiverer det, kan det føre til utførelse av ondsinnet kode som er innebygd i de opplastede filene. Den beste fremgangsmåten er å enten lokalisere bildekatalogen utenfor dokumentroten som er tilgjengelig for webserveren og servere den via et mellomliggende skript, eller deaktivere PHP -kjøring for katalogen som lagrer de opplastede filene.
Også muliggjøring av dynamisk lasting av PHP -utvidelser (via enable_dl
konfigurasjonsdirektiv) i et delt webhotellmiljø kan føre til sikkerhetsproblemer.
Implisitte typen konverteringer som fører til ulike verdier blir behandlet som likeverdige, noen ganger mot programmererens hensikt, kan føre til sikkerhetsproblemer. For eksempel, resultatet av sammenligningen '0e1234' == '0'
er true
, fordi strengene som analyseres som tall er omregnet til tall; i dette tilfellet blir den første sammenlignede verdien behandlet som vitenskapelig notasjon som har verdien (0 × 10 1234 ), som er null. Feil som dette resulterte i godkjenningssårbarheter i Simple Machines Forum , Typo3 og phpBB når MD5 -passordhaser ble sammenlignet. Den anbefalte måten er å bruke hash_equals () (for timing angrepssikkerhet ), strcmp
eller identitetsoperatøren ( ===
), som '0e1234' === '0'
resulterer i false
.
I en 2013 analyse av over 170 000 nettside defacements , utgitt av Zone-H , den hyppigst (53%) brukt teknikk var utnyttelsen av fil inkludering sårbarhet , hovedsakelig knyttet til usikre bruk av PHP språkkonstruksjoner include
, require
og allow_url_fopen
.
Fra april 2021 rapporterer W3Techs at 64% av nettstedene som bruker PHP bruker versjon 7.2 eller eldre (som ikke lenger støttes av PHP Development Team) med 35% av alle PHP -nettsteder som bruker versjon 5.6 eller eldre.
Versjon 5 brukes fortsatt av 24,5% av alle nettstedene (september 2021). Det anbefales på det sterkeste å migrere til PHP versjon 7 eller 8 og bruke random_int () i stedet for rand () eller mt_rand (). Det er to angrep som kan utføres over PHP -entropikilder: "Seed Attack" og "State recovery attack". Med dagens GPU -teknologier kan en angriper utføre opptil 2^30 MD5 -beregninger per sekund med en $ 250 GPU, mens med ytterligere $ 500 kan nå opptil 2^32 beregninger. I kombinasjon med " Bursdagsangrep " kan dette føre til alvorlige sikkerhetsproblemer.
Se også
- Sammenligning av programmeringsspråk
- Sammenligning av webrammer
- Liste over AMP -pakker
- Liste over PHP -akseleratorer
- Liste over PHP -redaktører
- PEAR (PHP Extension and Application Repository)
- PHP akselerator
- Malprosessor
- XAMPP (gratis og åpen kildekode-plattform for webserverløsningsstabelpakker)
- Zend Server
Referanser
Videre lesning
-
Ford, Paul (11. juni 2015). "Hva er kode?" . Bloomberg Businessweek .
Hva er det absolutt minste jeg må vite om PHP?
- PHP hos Curlie