# PHP

PHP (PHP: Hypertext Preprocessor, vroeger Personal Home Page) is een scripttaal, die bedoeld is om op webservers dynamische webpagina's te creëren. PHP is in 1994 ontworpen door Rasmus Lerdorf, een senior softwareontwikkelaar bij IBM. Lerdorf gebruikte Perl als inspiratie.
Aanvankelijk stonden de letters PHP voor Personal Home Page, maar sinds PHP 3.0 is de betekenis een recursief acroniem geworden: PHP: Hypertext Preprocessor. Deze naam geeft aan waar de taal meestal voor gebruikt wordt: informatie verwerken tot hypertext.

## Kenmerken

PHP is een scripttaal en is vergelijkbaar met Perl, Python en Ruby. Qua syntaxis lijkt PHP het meest op C, maar net als bij veel andere scripttalen moeten variabelen voorafgegaan worden door een dollarteken $. Dit is overgenomen uit de scripttaal Perl, waarvan PHP mede is afgeleid. In tegenstelling tot C is het in PHP wel mogelijk om naast procedureel programmeren ook objectgeoriënteerd te programmeren, net als in bijvoorbeeld Java, C++ en C#. In de eerste versies van PHP was het objectgeoriënteerd programmeren nog heel beperkt. Pas sinds versie 5 zijn de meest essentiële functies hiervoor allemaal beschikbaar.
PHP is een zogenaamde server-side scripting-taal, die hoofdzakelijk wordt gebruikt om op de webserver dynamische webpagina's te creëren. De gebruikte PHP-code is voor de gebruiker onzichtbaar. Alleen het resultaat is zichtbaar en ziet eruit als een gewone HTML-pagina. Doordat PHP als opensourcesoftware is uitgebracht, is het in relatief korte tijd zeer populair geworden. Er is een brede ondersteuning vanuit de community op het internet. Naast server-side scripting kan PHP ook gebruikt worden via de opdrachtregel of in grafische applicaties, bijvoorbeeld met PHP-GTK (PHP met GTK+).
PHP wordt vaak in combinatie met een relationele database gebruikt. De meest gebruikte relationele databases voor PHP zijn MySQL en PostgreSQL, maar het is ook mogelijk om andere databases te gebruiken, zoals MongoDB en mSQL. Er zijn veel verschillende toepassingsmogelijkheden voor PHP, zoals het verwerken van data, het aanspreken van databases, bestandsbewerking en het genereren van afbeeldingen en XML. Een deel hiervan zit ingebakken in de taal, een deel hiervan is via extensies en modules beschikbaar (onder andere via PEAR).

## Geschiedenis

PHP werd in 1994 ontwikkeld door Rasmus Lerdorf. De eerste publieke versie werd Personal Home Page/Forms Interpreter genoemd en uitgegeven in 1995. Later dat jaar volgde versie 2. In 1997 herschreven Zeev Suraski en Andi Gutmans, twee Israëlische ontwikkelaars aan de Technion IIT, de PHP parser. Het ontwikkelteam bracht PHP/FI 2 officieel in november 1997 uit, na maanden van beta-tests. Hierna begon de publieke test van PHP 3 en in juni 1998 werd PHP 3 officieel uitgebracht. Hierbij werd ook de naam veranderd naar PHP: Hypertext Preprocessor.
Suraski en Gutmans begonnen daarna met het herschrijven van de PHP parser, met de Zend Engine als resultaat. In 1999 werd hiervoor Zend Technologies opgericht in Ramat Gan, Israël. De naam Zend is een samenvoegsel van hun beide voornamen, Zeev en Andi.
Op 22 mei 2000 werd PHP 4 uitgebracht, dat werd aangedreven door Zend Engine 1. Op 13 juli 2004 werd deze opgevolgd door PHP 5, aangedreven door de nieuwe Zend Engine 2. Ondanks dat PHP 5 al sinds 2004 beschikbaar was, gebruikten veel webservers pas sinds begin 2007 PHP 5, omdat eerdere versies niet stabiel genoeg waren. De meest recente stabiele versie is 5.6.29, dat werd uitgebracht op 8 december 2016. Dit is tevens de laatste release van PHP 5 onder actieve ondersteuning. Vanaf 2017 tot en met 2018 werden voor PHP 5.6 alleen nog beveiligingsaanpassingen uitgebracht.
De belangrijkste kenmerken van PHP 5 waren het verbeterde objectgeoriënteerd programmeren, de hogere snelheid, de mogelijkheid om SQLite aan te spreken en de vernieuwde Extensible Markup Language (XML)-bibliotheek. Tot en met de laatste versie 5.6 zijn er nog vele functionaliteiten toegevoegd.
Een versie 6 is nooit verschenen. Er is wel een aanzet voor geweest en een belangrijk onderdeel zou ondersteuning voor Unicode moeten worden. Er was de nodige kritiek op de implementatie en er was ook een tekort aan ontwikkelaars die de benodigde grote aanpassingen konden uitvoeren. Uiteindelijk is de ontwikkeling in maart 2010 gestrand. Verschillende onderdelen die in versie 6 zouden komen, zijn naar versies 5.3 overgezet. Andere aanpassingen zoals traits en closure re-binding zijn in PHP 5.4 terechtgekomen. Om verwarring te voorkomen over de oorspronkelijk beoogde versie 6 (bijvoorbeeld boeken die al geschreven werden) en de werkelijke opvolger van de PHP 5-tak, werd besloten om door te nummeren bij 7.
Op 3 december 2015 kwam PHP 7.0.0 beschikbaar, aangedreven door Zend Engine 3, met sterk verbeterde snelheid en nieuwe functionaliteiten waaronder typehinting op scalaire types en returntypes. Op 1 december 2016 verscheen PHP 7.1.0. Nieuw in deze versie zijn onder andere: nullable-types; void-returntype voor functies en itereerbaar pseudotype.
Op 26 november 2020 is PHP 8 verschenen met sterk verbeterende functionaliteiten. Deze versie wordt aangedreven door Zend Engine 4.

## Gebruik

PHP wordt veel gebruikt om op webservers dynamisch webpagina's te creëren. De code van de pagina wordt op de webserver uitgevoerd en het resultaat wordt naar de computer van de bezoeker gestuurd en in de webbrowser getoond. Dit in tegenstelling tot client-side-scripting (zoals JavaScript), waarbij de webbrowser eerst de code van de webserver downloadt en vervolgens zelf (op de computer van de bezoeker) uitvoert. Wanneer een browser een PHP-document oproept, wordt op de server eerst de in het document opgenomen PHP-code uitgevoerd. Dit gebeurt door de PHP-interpreter (de PHP-engine). Het resultaat (meestal HTML) wordt door de webserver naar de browser gestuurd. PHP kan echter ook andere documenttypen, zoals afbeeldingen of XML, genereren.
PHP-documenten hebben op de server meestal de extensie .php, maar ook de oudere extensies worden nog sporadisch gebruikt. Deze bestandsnaam op de server wordt meestal verborgen voor de bezoeker, door gebruik te maken van URL-rewriting (het herschrijven van de URL).
PHP wordt vaak gebruikt in combinatie met het besturingssysteem Linux, de Apache webserver en de MySQL databasesoftware. Een dergelijke combinatie wordt afgekort tot LAMP. Het komt ook weleens voor dat men Windows gebruikt in plaats van Linux. WAMP is hierbij de afkorting voor systemen die Windows gebruiken en er wordt weleens de afkorting MAMP gebruikt voor de Apple Macintosh. Ook zijn er kant en klare programma's die een volledige WAMP-omgeving installeren. Voorbeelden hiervan zijn WAMP en XAMPP.

### Populariteit

PHP wordt voor allerlei webapplicaties gebruikt, zoals bulletinboards/forums, contentmanagementsystemen, blogs en wiki's. Uit een analyse van W3Techs in mei 2022 blijkt dat op 77,4% van alle webservers waarvan de programmeertaal bekend is, PHP wordt gebruikt.

## Syntaxis

In PHP-documenten kan op meerdere manieren tekst aan de gebruiker worden gepresenteerd. In server-side documenten kan PHP vrij tussen de HTML-tags worden aangeroepen. In onderstaand voorbeeld wordt alle tekst buiten de PHP-tags automatisch naar de browser gestuurd. Alles binnen de PHP-tags wordt door de PHP-interpreter uitgevoerd. Op deze wijze kunnen dynamische HTML-documenten worden gecreëerd.
In PHP kunnen strings zowel met enkele als met dubbele aanhalingstekens geschreven worden. Variabelen beginnen met een dollarteken. Als strings met dubbele aanhalingstekens geschreven worden dan worden de variabelen die gebruikt worden in de string vervangen door hun waarde (dit wordt variable interpolation genoemd).
Hieronder een voorbeeld dat variable interpolation gebruikt om de URL van dit artikel aan de gebruiker te melden:
Om met een database te interacteren dient PHP eerst naar een DBMS (bijvoorbeeld MySQL) te verbinden. Hiervoor kan onder andere de mysqli-library van PHP worden gebruikt:
Vervolgens kan er na de verbinding, door middel van de SQL-taal, gegevens worden opgevraagd. Hieronder een voorbeeld om een nieuwsartikel op te halen:

## Veiligheid

De totaalsom van in PHP geschreven applicaties bleek over de jaren 1996-2003 goed te zijn voor ongeveer 29% van alle beveiligingskwetsbaarheden (van bijvoorbeeld cross-site scripting tot denial of service) die gemeld en geregistreerd waren met een CVE-verwijzing in de National Vulnerability Database, een door de Amerikaanse overheid opgezette website waar beveiligingsproblemen aan software worden aangemeld. Enkele specifieke taal-eigenschappen en (standaard ingestelde) configuratieparameters (zoals magic quotes en register_globals) bleken PHP in het verleden onveilig te maken. Ondersteuning voor magic_quotes_gpc en register_globals is sinds versie 5.3.0 gemarkeerd als uitgefaseerd en sinds versie 5.4.0 volledig uit PHP verwijderd.
Daarnaast worden ook in PHP zelf met enige regelmaat beveiligingskwetsbaarheden aangetroffen en opgelost, ongeveer 658 stuks (geteld tot 15 april 2022).
Ten minste een van die beveiligingskwetsbaarheden werd in 2012 door Nederlanders ontdekt, bij de National Vulnerability Database bekend als CVE-2012-1823. De kwetsbaarheid was dat de broncode van PHP-pagina's op sommige serverconfiguraties bleek op te vragen door slechts een enkele parameter aan de URL van de pagina toe te voegen. Versies 5.3.12 en 5.4.2 werden speciaal uitgebracht om een oplossing voor deze kwetsbaarheid te bieden.

## Ontwikkelomgevingen

Veel broncode-editors bieden ondersteuning voor PHP, zoals syntaxiskleuring en automatische aanvulling. Enkele hiervan zijn:
* Aptana Studio 3 (open source)
* Coda, exclusief voor Mac OS X
* ConTEXT
* Crimson Editor
* Dreamweaver (Adobe)
* Eclipse met PHP Development Tools
* gedit
* jEdit
* NetBeans
* Notepad++
* Sublime Text
* Vim (teksteditor)
* PHPEdit
* PHPDesigner
* PhpStorm
* HTML-KIT
* PSPad
* NuSphere phpEd
* TextPad
* TextWrangler
* Notepad2
* EditPad
* Zend Studio
* BBEdit
* SciTE
Daarnaast zijn er voor PHP5 verschillende frameworks beschikbaar die bepaalde taken van de programmeur overnemen. Enkele hiervan zijn:
* CakePHP
* CodeIgniter
* Kohana
* Laravel
* PHPDevShell
* PHP on Trax
* QPHP
* Symfony
* Yii
* Zend Framework
Met behulp van PHPDoc kan documentatie vanuit de broncode gegenereerd worden; dit is vergelijkbaar met Javadoc voor Java. Ook voor unittesten zijn standaardoplossingen beschikbaar, zoals bijvoorbeeld PHPUnit.