PHP

Aus besserwiki.de
PHP
PHP-logo.svg
Paradigma Multi-Paradigma: imperativ, funktional, objektorientiert, prozedural, reflektiv
Entworfen von Rasmus Lerdorf
Entwickler Das PHP-Entwicklungsteam, Zend Technologies, PHP Foundation
Erstmals erschienen 8. Juni 1995; vor 27 Jahren
Disziplin der Typisierung Dynamisch, schwach

seit Version 7.0: Schrittweise

Implementierungssprache C (hauptsächlich; einige Komponenten C++)
BETRIEBSSYSTEM Unix-ähnlich, Windows, macOS, IBM i, OpenVMS
Lizenz PHP-Lizenz (der größte Teil der Zend-Engine unter der Zend-Engine-Lizenz)
Dateinamen-Erweiterungen .php,.phar,.phtml,.pht,.phps
Wichtigste Implementierungen
Zend Engine, HHVM, PeachPie, Quercus, Parrot
Beeinflusst von
Perl, HTML, C, C++, Java, Tcl, JavaScript, Hack
Beeinflusst
Hack, JSP, ASP
  • PHP-Programmierung bei Wikibooks

PHP ist eine Allzweck-Skriptsprache für die Webentwicklung. Sie wurde ursprünglich von dem dänisch-kanadischen Programmierer Rasmus Lerdorf im Jahr 1994 entwickelt. Die PHP-Referenzimplementierung wird heute von The PHP Group produziert. Ursprünglich stand PHP für Personal Home Page (Persönliche Homepage), aber jetzt steht es für den rekursiven Initialismus PHP: Hypertext Preprocessor.

PHP-Code wird in der Regel auf einem Webserver von einem PHP-Interpreter verarbeitet, der als Modul, Daemon oder als ausführbare Datei des Common Gateway Interface (CGI) implementiert ist. Auf einem Webserver bildet das Ergebnis des interpretierten und ausgeführten PHP-Codes - bei dem es sich um jede Art von Daten handeln kann, wie z. B. generiertes HTML oder binäre Bilddaten - die gesamte oder einen Teil einer HTTP-Antwort. Es gibt verschiedene Web-Template-Systeme, Web-Content-Management-Systeme und Web-Frameworks, die zur Orchestrierung oder Erleichterung der Erzeugung dieser Antwort eingesetzt werden können. Darüber hinaus kann PHP für viele Programmieraufgaben außerhalb des Webkontextes verwendet werden, z. B. für eigenständige grafische Anwendungen und die Steuerung von Roboterdrohnen. PHP-Code kann auch direkt über die Befehlszeile ausgeführt werden.

Der Standard-PHP-Interpreter, der von der Zend Engine unterstützt wird, ist freie Software, die unter der PHP-Lizenz veröffentlicht wird. PHP ist weithin portiert worden und kann auf den meisten Webservern auf einer Vielzahl von Betriebssystemen und Plattformen eingesetzt werden.

Die PHP-Sprache entwickelte sich bis 2014 ohne eine schriftliche formale Spezifikation oder einen Standard, wobei die ursprüngliche Implementierung als De-facto-Standard fungierte, dem andere Implementierungen folgen sollten. Seit 2014 wird an der Erstellung einer formalen PHP-Spezifikation gearbeitet.

W3Techs berichtet, dass im Januar 2022 "PHP von 78,1 % aller Websites verwendet wird, deren serverseitige Programmiersprache wir kennen." PHP Version 7.4 ist die am häufigsten verwendete Version. Die Unterstützung für Version 7.3 wurde am 6. Dezember 2021 eingestellt.

PHP
PHP-logo.svg
Basisdaten
Wichtige Implementierungen: Zend Engine, HHVM, Phalanger (Compiler)

Geschichte

Seit der Veröffentlichung im Jahr 1995 nahmen die Entwickler umfangreiche Änderungen innerhalb der Programmiersprache vor. Der Kern der Sprache wurde mit PHP 3 komplett neu erstellt. Deutliche Anpassungen wurden mit PHP 5 bzw. PHP 5.3 vorgenommen, die den Fokus der Programmiersprache auf die objektorientierte Programmierung legt. Klassen waren jedoch bereits mit der vierten Version nutzbar.

Rasmus Lerdorf, der Erfinder von PHP, sowie Andi Gutmans und Zeev Suraski, die Erfinder der Zend Engine

Frühe Geschichte

Die Entwicklung von PHP begann 1994, als Rasmus Lerdorf mehrere Common Gateway Interface (CGI)-Programme in C schrieb, die er zur Pflege seiner persönlichen Homepage verwendete. Er erweiterte sie, um mit Webformularen zu arbeiten und mit Datenbanken zu kommunizieren, und nannte diese Implementierung "Personal Home Page/Forms Interpreter" oder PHP/FI.

Mit PHP/FI ließen sich einfache, dynamische Webanwendungen erstellen. Um die Fehlerberichterstattung zu beschleunigen und den Code zu verbessern, kündigte Lerdorf am 8. Juni 1995 in der Usenet-Diskussionsgruppe comp.infosystems.www.authoring.cgi die Veröffentlichung von PHP/FI als "Personal Home Page Tools (PHP Tools) Version 1.0" an. Diese Version enthielt bereits die grundlegende Funktionalität, die PHP heute hat. Dazu gehörten Perl-ähnliche Variablen, Formularverarbeitung und die Möglichkeit, HTML einzubetten. Die Syntax ähnelte der von Perl, war aber einfacher, begrenzter und weniger konsistent.

Ein Beispiel für die frühe PHP-Syntax:

Das frühe PHP war nicht als neue Programmiersprache gedacht, sondern entwickelte sich organisch, wie Lerdorf rückblickend feststellte: "Ich weiß nicht, wie man es aufhalten kann, es gab nie die Absicht, eine Programmiersprache zu schreiben [...] Ich habe absolut keine Ahnung, wie man eine Programmiersprache schreibt, ich habe einfach immer den nächsten logischen Schritt auf dem Weg hinzugefügt." Ein Entwicklungsteam begann sich zu bilden und nach monatelanger Arbeit und Betatests wurde PHP/FI 2 im November 1997 offiziell veröffentlicht.

Die Tatsache, dass PHP nicht ursprünglich entworfen wurde, sondern sich organisch entwickelte, führte zu einer inkonsistenten Benennung von Funktionen und einer inkonsistenten Anordnung ihrer Parameter. In einigen Fällen wurden die Funktionsnamen so gewählt, dass sie zu den untergeordneten Bibliotheken passten, die PHP "umhüllte", während in einigen sehr frühen Versionen von PHP die Länge der Funktionsnamen intern als Hash-Funktion verwendet wurde, so dass die Namen so gewählt wurden, dass die Verteilung der Hash-Werte verbessert wurde.

PHP 3 und 4

Dies ist ein Beispiel für PHP-Code für das Content-Management-System WordPress.

Zeev Suraski und Andi Gutmans schrieben den Parser 1997 neu und bildeten die Grundlage für PHP 3, wodurch der Name der Sprache in das rekursive Akronym PHP geändert wurde: Hypertext Preprocessor. Danach begannen die öffentlichen Tests von PHP 3, und die offizielle Markteinführung erfolgte im Juni 1998. Suraski und Gutmans begannen daraufhin mit einer Neufassung des PHP-Kerns und entwickelten 1999 die Zend Engine. Sie gründeten auch Zend Technologies in Ramat Gan, Israel.

Am 22. Mai 2000 wurde PHP 4, basierend auf der Zend Engine 1.0, veröffentlicht. Im August 2008 hatte dieser Zweig die Version 4.4.9 erreicht. PHP 4 befindet sich nicht mehr in der Entwicklung und es sind auch keine Sicherheitsupdates geplant.

PHP 5

Am 1. Juli 2004 wurde PHP 5 veröffentlicht, das von der neuen Zend Engine II unterstützt wird. PHP 5 enthielt neue Funktionen wie eine verbesserte Unterstützung für objektorientierte Programmierung, die PHP Data Objects (PDO)-Erweiterung (die eine leichtgewichtige und konsistente Schnittstelle für den Zugriff auf Datenbanken definiert) und zahlreiche Leistungsverbesserungen. Im Jahr 2008 wurde PHP 5 zur einzigen stabilen Version in der Entwicklung. Die späte statische Bindung, die in früheren PHP-Versionen fehlte, wurde in Version 5.3 hinzugefügt.

Viele bekannte Open-Source-Projekte unterstützten PHP 4 seit dem 5. Februar 2008 nicht mehr in neuem Code. Grund dafür war die GoPHP5-Initiative, die von einem Konsortium von PHP-Entwicklern ins Leben gerufen wurde, die den Übergang von PHP 4 zu PHP 5 unterstützen.

Im Laufe der Zeit wurden PHP-Interpreter auf den meisten 32-Bit- und 64-Bit-Betriebssystemen verfügbar, indem sie entweder aus dem PHP-Quellcode erstellt wurden oder indem vorgefertigte Binärdateien verwendet wurden. Für die PHP-Versionen 5.3 und 5.4 waren die einzigen verfügbaren Microsoft-Windows-Binärdistributionen 32-Bit-IA-32-Builds, die den Windows-32-Bit-Kompatibilitätsmodus erforderten, während die Internet-Informationsdienste (IIS) auf einer 64-Bit-Windows-Plattform verwendet wurden. Mit der PHP-Version 5.5 wurden die 64-Bit-x86-64-Builds für Microsoft Windows verfügbar.

Die offizielle Sicherheitsunterstützung für PHP 5.6 endete am 31. Dezember 2018.

PHP 6 und Unicode

PHP erhielt gemischte Kritiken aufgrund der fehlenden nativen Unicode-Unterstützung auf der Ebene der Kernsprache. Im Jahr 2005 wurde ein Projekt unter der Leitung von Andrei Zmievski initiiert, um PHP mit nativer Unicode-Unterstützung auszustatten, indem die ICU-Bibliothek (International Components for Unicode) eingebettet und Textstrings intern als UTF-16 dargestellt wurden. Da dies größere Änderungen sowohl an den Interna der Sprache als auch am Benutzercode mit sich bringen würde, war geplant, dies als Version 6.0 der Sprache zu veröffentlichen, zusammen mit anderen wichtigen Funktionen, die sich damals in der Entwicklung befanden.

Der Mangel an Entwicklern, die die notwendigen Änderungen verstanden, und die Leistungsprobleme, die sich aus der Konvertierung von und nach UTF-16 ergaben, das im Webkontext nur selten verwendet wird, führten jedoch zu Verzögerungen im Projekt. Infolgedessen wurde 2009 eine Version von PHP 5.3 erstellt, in der viele Nicht-Unicode-Funktionen aus PHP 6 zurückportiert wurden, vor allem Namespaces. Im März 2010 wurde das Projekt in seiner jetzigen Form offiziell aufgegeben und eine Version PHP 5.4 vorbereitet, die die meisten verbleibenden Nicht-Unicode-Funktionen von PHP 6 enthielt, wie z. B. Traits und Closure Re-Binding. Anfänglich hoffte man, dass ein neuer Plan für die Unicode-Integration entwickelt werden würde, aber bis 2014 wurde keiner angenommen.

PHP 7

In den Jahren 2014 und 2015 wurde eine neue PHP-Hauptversion entwickelt, PHP 7. Die Nummerierung dieser Version sorgte für einige Diskussionen unter den internen Entwicklern. Obwohl das PHP 6 Unicode-Experiment nie veröffentlicht worden war, wurde in mehreren Artikeln und Buchtiteln auf den Namen PHP 6 verwiesen, was zu Verwirrung hätte führen können, wenn eine neue Version diesen Namen wieder verwenden würde. Nach einer Abstimmung wurde der Name PHP 7 gewählt.

Die Grundlage von PHP 7 ist ein PHP-Zweig, der ursprünglich als PHP next generation (phpng) bezeichnet wurde. Er wurde von Dmitry Stogov, Xinchen Hui und Nikita Popov verfasst und zielte darauf ab, die PHP-Leistung durch eine Überarbeitung der Zend Engine zu optimieren und gleichzeitig eine nahezu vollständige Sprachkompatibilität beizubehalten. Bis zum 14. Juli 2014 zeigten WordPress-basierte Benchmarks, die als Haupt-Benchmark-Suite für das phpng-Projekt dienten, eine Leistungssteigerung von fast 100 %. Die Änderungen von phpng erleichtern die Verbesserung der Leistung in zukünftigen Versionen, da kompaktere Datenstrukturen und andere Änderungen als besser geeignet für eine erfolgreiche Migration zu einem Just-in-Time-Compiler (JIT) angesehen werden. Aufgrund der bedeutenden Änderungen wurde die überarbeitete Zend Engine als Zend Engine 3 bezeichnet, als Nachfolgerin der in PHP 5 verwendeten Zend Engine 2.

Aufgrund der großen internen Änderungen in phpng muss es eine neue Hauptversionsnummer von PHP erhalten und nicht eine Unterversion von PHP 5, wie es der PHP-Release-Prozess vorsieht. Hauptversionen von PHP dürfen die Abwärtskompatibilität des Codes aufheben, und daher bot PHP 7 die Gelegenheit für andere Verbesserungen als phpng, die Abwärtskompatibilitätsbrüche erfordern. Im Einzelnen handelt es sich um die folgenden Änderungen:

  • Viele fatale oder wiederherstellbare PHP-Fehlermechanismen wurden durch moderne objektorientierte Ausnahmen ersetzt.
  • Die Syntax für die Dereferenzierung von Variablen wurde überarbeitet, um intern konsistenter und vollständiger zu sein, und erlaubt die Verwendung der Operatoren ->, [], (), {} und :: mit beliebigen sinnvollen Ausdrücken auf der linken Seite.
  • Die Unterstützung für alte Konstruktormethoden im Stil von PHP 4 wurde abgeschafft.
  • Das Verhalten der foreach-Anweisung wurde geändert, um besser vorhersehbar zu sein.
  • Konstruktoren für die wenigen in PHP eingebauten Klassen, die im Fehlerfall null zurückgaben, wurden geändert, um eine Ausnahme zu erzeugen.
  • Mehrere nicht gewartete oder veraltete Server Application Programming Interfaces (SAPIs) und Erweiterungen wurden aus dem PHP-Kern entfernt, vor allem die alte mysql-Erweiterung.
  • Das Verhalten des list()-Operators wurde geändert, um die Unterstützung für Strings zu entfernen.
  • Die Unterstützung für die alten ASP-ähnlichen Trennzeichen <% und %> wurde entfernt. <script language="php"> ... </script>.
  • Ein Versehen, durch das eine switch-Anweisung mehrere Standardklauseln enthalten konnte, wurde behoben.
  • Die Unterstützung für hexadezimale Zahlen in einigen impliziten Konvertierungen von Strings in Zahlentypen wurde entfernt.
  • Die Linksverschiebungs- und Rechtsverschiebungsoperatoren wurden geändert, um ein konsistenteres Verhalten auf verschiedenen Plattformen zu gewährleisten.
  • Konvertierungen zwischen Fließkommazahlen und ganzen Zahlen wurden geändert (z.B. wird Unendlich nun in Null umgewandelt) und plattformübergreifend konsistenter implementiert.

PHP 7 enthielt auch neue Sprachfunktionen. Vor allem wurden Rückgabetyp-Deklarationen für Funktionen eingeführt, die die bestehenden Parametertyp-Deklarationen ergänzen, sowie Unterstützung für die skalaren Typen (Integer, Float, String und Boolean) in Parameter- und Rückgabetyp-Deklarationen.

PHP 8

PHP 8 wurde am 26. November 2020 veröffentlicht. PHP 8 ist eine Hauptversion und weist gegenüber den Vorgängerversionen wesentliche Änderungen auf. Zu den neuen Funktionen und bemerkenswerten Änderungen gehören:

Just-in-Time-Kompilierung

Die Just-in-Time-Kompilierung wird in PHP 8 unterstützt.

Der JIT-Compiler von PHP 8 kann in einigen Anwendungsfällen zu erheblichen Leistungsverbesserungen führen. Der PHP-Entwickler Nikita Popov erklärte jedoch, dass die Leistungsverbesserungen für die meisten Websites weniger erheblich sein werden als beim Upgrade von PHP 5 auf PHP 7. Erhebliche Verbesserungen werden eher für mathematische Operationen als für die üblichen Anwendungsfälle der Webentwicklung erwartet. Außerdem bietet der JIT-Compiler die Möglichkeit, einen Teil des Codes von C nach PHP zu verlagern, da die Leistung in einigen Anwendungsfällen verbessert wird.

Hinzufügen des Match-Ausdrucks

Mit PHP 8 wurde der Match-Ausdruck eingeführt. Der match-Ausdruck ähnelt konzeptionell einer switch-Anweisung und ist für einige Anwendungsfälle kompakter. Da match ein Ausdruck ist, kann sein Ergebnis in einer Variablen aufgefangen oder von einer Funktion zurückgegeben werden.

Typänderungen und Ergänzungen

Mit PHP 8 wurden Union-Typen, ein neuer statischer Rückgabetyp und ein neuer gemischter Typ eingeführt.

"Attribute", die in anderen Programmiersprachen oft als "Annotationen" bezeichnet werden, wurden in PHP 8 hinzugefügt und ermöglichen das Hinzufügen von Metadaten zu Klassen.

throw wurde von einer Anweisung in einen Ausdruck umgewandelt. Dadurch können Ausnahmen an Stellen ausgelöst werden, die vorher nicht möglich waren.

Änderungen und Ergänzungen der Syntax

PHP 8 enthält Änderungen, die alternative, prägnantere oder konsistentere Syntaxen in einer Reihe von Szenarien ermöglichen. Der nullsafe-Operator zum Beispiel ähnelt dem Null-Coalescing-Operator ??, wird aber beim Aufruf von Methoden verwendet. Der folgende Codeschnipsel löst keinen Fehler aus, wenn getBirthday() null zurückgibt:

Die Förderung von Konstruktoreigenschaften wurde als "syntaktischer Zucker" hinzugefügt, so dass Klasseneigenschaften automatisch gesetzt werden können, wenn Parameter an einen Klassenkonstruktor übergeben werden. Dadurch wird der Umfang des zu schreibenden Boilerplate-Codes reduziert.

Weitere kleinere Änderungen umfassen die Unterstützung für die Verwendung von ::class bei Objekten, was als Alternative für die Verwendung von get_class() dient; nicht fangende Catches in try-catch-Blöcken; Anpassungen der Variablensyntax zur Beseitigung von Inkonsistenzen; Unterstützung für benannte Argumente; und Unterstützung für abschließende Kommas in Parameterlisten, was die Konsistenz mit der Unterstützung für abschließende Kommas in anderen Kontexten, wie z. B. in Arrays, erhöht.

Änderungen und Ergänzungen der Standardbibliothek

  • WeakMaps wurden in PHP 8 hinzugefügt. Eine WeakMap enthält Verweise auf Objekte, aber diese Verweise verhindern nicht, dass diese Objekte vom Garbage Collecting erfasst werden. Dies kann in Szenarien, in denen Daten zwischengespeichert werden, zu Leistungsverbesserungen führen; dies ist insbesondere für objektrelationale Mappings (ORM) von Bedeutung.
  • Verschiedene Anpassungen an Schnittstellen, wie z.B. das Hinzufügen von Unterstützung für die Erstellung von DateTime-Objekten aus Schnittstellen und das Hinzufügen einer Stringable-Schnittstelle, die für Type Hinting verwendet werden kann.
  • Verschiedene neue Funktionen wie str_contains(), str_starts_with() und str_ends_with(); fdiv(); get_debug_type(); und get_resource_id()
  • Objektimplementierung von token_get_all()

Zusätzliche Änderungen

  • Typ-Annotationen wurden auch in den C-Quellcode von PHP selbst eingefügt, damit interne Funktionen und Methoden über "vollständige Typinformationen in der Reflexion" verfügen.
  • Vererbung mit privaten Methoden
  • Abstrakte Methoden in Traits - Verbesserungen

PHP 8.1

PHP 8.1 wurde am 25. November 2021 veröffentlicht. Es enthält mehrere Verbesserungen, wie Aufzählungen (auch "Enums" genannt), schreibgeschützte Eigenschaften und das Entpacken von Arrays mit String-Schlüsseln.

Unterstützung für Aufzählungen

Die Unterstützung von Aufzählungen war eine der wichtigsten Funktionen von PHP 8.1. Enums ermöglichen es Entwicklern, Zustände in ihrer Codebasis programmatisch zu erzwingen. Unten sehen Sie ein Beispiel für eine Aufzählung:

Andere Funktionen von PHP 8.1

  • Unterstützung für "readonly"-Eigenschaften wurde hinzugefügt.
  • Nach der Einführung des Entpackens von Arrays in PHP 7.4 mit fortlaufend nummerierten Schlüsseln, wurde mit PHP 8.1 die Unterstützung für das Entpacken von Arrays mit String-Schlüsseln eingeführt.
  • PHP 8.1 unterstützt nun die Verwendung von `new` in Initialisierern.
  • Es wurde eine neue Syntax für die Erstellung von Callables hinzugefügt.
  • PHP 8.1 brachte die Unterstützung für Pure Intersection Types, nach der Einführung von Union Types in PHP 8.0.

Release-Geschichte

Version Datum der Veröffentlichung Unterstützt bis Anmerkungen
1.0 8. Juni 1995 Offiziell "Personal Home Page Tools (PHP Tools)" genannt. Dies ist die erste Verwendung des Namens "PHP".
2.0 1. November 1997 Offizielle Bezeichnung "PHP/FI 2.0". Dies ist die erste Version, die tatsächlich als PHP bezeichnet werden kann, da es sich um eine eigenständige Sprache mit vielen Funktionen handelt, die bis zum heutigen Tag erhalten geblieben sind.
3.0 6. Juni 1998 20. Oktober 2000 Die Entwicklung geht von einer Person auf mehrere Entwickler über. Zeev Suraski und Andi Gutmans schreiben die Basis für diese Version neu.
4.0 22. Mai 2000 23. Juni 2001 Hinzufügen eines fortschrittlicheren zweistufigen Parse-/Execute-Tag-Parsing-Systems, genannt die Zend-Engine.
4.1 10. Dezember 2001 12. März 2002 Einführung von "superglobals" ($_GET, $_POST, $_SESSION, etc.)
4.2 22. April 2002 6. September 2002 Deaktivierung von register_globals als Standard. Über das Netz empfangene Daten werden nicht mehr direkt in den globalen Namensraum eingefügt, wodurch mögliche Sicherheitslücken in Anwendungen geschlossen werden.
4.3 27. Dezember 2002 31. März 2005 Einführung der Befehlszeilenschnittstelle (CLI) zur Ergänzung des CGI.
4.4 11. Juli 2005 7. August 2008 Behebung eines Speicherkorruptionsfehlers, der es erforderlich machte, die Binärkompatibilität mit Erweiterungen, die mit PHP Version 4.3.x kompiliert wurden, zu unterbrechen.
5.0 13. Juli 2004 5. September 2005 Zend Engine II mit einem neuen Objektmodell.
5.1 24. November 2005 24. August 2006 Leistungsverbesserungen durch Einführung von Compiler-Variablen in der überarbeiteten PHP-Engine. Hinzufügen von PHP Data Objects (PDO) als einheitliche Schnittstelle für den Zugriff auf Datenbanken.
5.2 2. November 2006 6. Januar 2011 Die Filtererweiterung ist standardmäßig aktiviert. Native JSON-Unterstützung.
5.3 30. Juni 2009 14. August 2014 Namespace-Unterstützung, späte statische Bindungen, Sprungmarke (begrenztes goto), anonyme Funktionen, Closures, PHP-Archive (phar), Garbage Collection für zirkuläre Referenzen, verbesserte Windows-Unterstützung, sqlite3, mysqlnd als Ersatz für libmysql als zugrunde liegende Bibliothek für die Erweiterungen, die mit MySQL arbeiten, fileinfo als Ersatz für mime_magic für eine bessere MIME-Unterstützung, die Internationalisierungserweiterung und die Veraltung der ereg-Erweiterung.
5.4 1. März 2012 3. September 2015 Trait-Unterstützung, Unterstützung für kurze Array-Syntax. Entfernte Elemente: register_globals, safe_mode, allow_call_time_pass_reference, session_register(), session_unregister() und session_is_registered(). Eingebauter Webserver. Verschiedene Verbesserungen der bestehenden Funktionen, der Leistung und des reduzierten Speicherbedarfs.
5.5 20. Juni 2013 10. Juli 2016 Unterstützung für Generatoren, Final Blocks für die Behandlung von Ausnahmen, OpCache (basierend auf Zend Optimizer+) in der offiziellen Distribution gebündelt.
5.6 28. August 2014 31. Dezember 2018 Konstante skalare Ausdrücke, variadische Funktionen, Entpacken von Argumenten, neuer Potenzierungsoperator, Erweiterungen der use-Anweisung für Funktionen und Konstanten, neuer phpdbg-Debugger als SAPI-Modul und weitere kleinere Verbesserungen.
6.x Nicht veröffentlicht Verlassene Version von PHP, die native Unicode-Unterstützung enthalten sollte.
7.0 3. Dezember 2015 10. Januar 2019 Zend Engine 3 (Leistungsverbesserungen und 64-Bit-Integer-Unterstützung unter Windows), einheitliche Variablensyntax, AST-basierter Kompilierungsprozess, Hinzufügen von Closure::call(), Konsistenz der bitweisen Verschiebung auf allen Plattformen, ?? (null coalesce)-Operator, Unicode-Codepoint-Escape-Syntax, Rückgabetypen-Deklarationen, Skalar-Typ-Deklarationen (Integer, Float, String und Boolean), <=> "Raumschiff"-Drei-Wege-Vergleichsoperator, Generator-Delegation, anonyme Klassen, einfachere und konsistentere CSPRNG-API, Ersatz vieler verbleibender interner PHP-"Fehler" durch die moderneren Exceptions und Shorthand-Syntax für den Import mehrerer Elemente aus einem Namespace.
7.1 1. Dezember 2016 1. Dezember 2019 Ungültiger Rückgabetyp, Sichtbarkeitsmodifikatoren für Klassenkonstanten
7.2 30. November 2017 30. November 2020 Deklaration von Objektparametern und Rückgabetypen, Libsodium-Erweiterung, Überschreibung von abstrakten Methoden, Erweiterung von Parametertypen
7.3 6. Dezember 2018 6. Dezember 2021 Flexible Heredoc- und Nowdoc-Syntax, Unterstützung für Referenzzuweisung und Array-Dekonstruktion mit list(), PCRE2-Unterstützung, hrtime()-Funktion
7.4 28. November 2019 28. November 2022 Typisierte Eigenschaften 2.0, Preloading, null-koaleszierender Zuweisungsoperator, Verbesserung von openssl_random_pseudo_bytes, Weak References, FFI - foreign function interface, immer verfügbare Hash-Erweiterung, Passwort-Hash-Registry, Multibyte-String-Splitting, Reflection für Referenzen, Unbundle ext/wddx, neuer benutzerdefinierter Objekt-Serialisierungsmechanismus
8.0 26. November 2020 26. November 2023 Just-In-Time (JIT)-Kompilierung, Arrays, die mit einem negativen Index beginnen, strengere/saubere Sprachsemantik (Validierung für abstrakte Trait-Methoden), sauberere String-Zahlen-Vergleiche, sauberere numerische Strings, TypeError bei ungültigen arithmetischen/bitweisen Operatoren, Neuklassifizierung verschiedener Engine-Fehler, konsistente Typ-Fehler für interne Funktionen, Fataler Fehler bei inkompatiblen Methodensignaturen), lokalunabhängige Float-zu-String-Konvertierung, Optimierung der Variablensyntax, Attribute, benannte Argumente, Match-Ausdruck, Förderung von Konstruktoreigenschaften, Union-Typen, gemischter Typ, statischer Rückgabetyp, Nullsafe-Operator, nicht fangende Catches, Wurf-Ausdruck, JSON-Erweiterung ist immer verfügbar.
8.1 25. November 2021 25. November 2024 Explizite oktale Integer-Literal-Notation, Aufzählungen, schreibgeschützte Eigenschaften, Syntax für First-Class-Callables, New in Initialisierern, reine Kreuzungstypen, Never-Return-Typ, finale Klassenbeschränkungen, Fasern
8.2 24. November 2022 24. November 2025 Nur-Lese-Klassen, null, false und true als eigenständige Typen, lokal-unabhängige Groß-/Kleinschreibung
Legende:
Alte Version
Ältere Version, die noch gepflegt wird
Neueste Version
Neueste Vorschau-Version
Zukünftige Version

Seit dem 28. Juni 2011 hat das PHP-Entwicklungsteam einen Zeitplan für die Veröffentlichung neuer PHP-Versionen eingeführt. Nach diesem System sollte jeden Monat mindestens eine neue Version erscheinen. Einmal pro Jahr sollte eine kleinere Version erscheinen, die neue Funktionen enthalten kann. Jede Nebenversion sollte mindestens zwei Jahre lang mit Sicherheits- und Fehlerkorrekturen unterstützt werden, gefolgt von mindestens einem Jahr, in dem nur Sicherheitskorrekturen vorgenommen werden, so dass der Veröffentlichungsprozess für jede Nebenversion insgesamt drei Jahre dauert. Während des dreijährigen Veröffentlichungsprozesses dürfen keine neuen Funktionen in eine Nebenversion aufgenommen werden, es sei denn, sie sind klein und in sich abgeschlossen.

Maskottchen

Der elePHPant, das PHP-Maskottchen

Das Maskottchen des PHP-Projekts ist der elePHPant, ein blauer Elefant mit dem PHP-Logo auf der Seite, entworfen von Vincent Pontier im Jahr 1998. "Die (PHP-)Buchstaben bildeten die Form eines Elefanten, wenn man ihn von der Seite betrachtet. Der elePHPant ist manchmal anders gefärbt, wenn er als Plüschtier vorliegt.

Von diesem Maskottchen wurden im Laufe der Jahre viele Varianten hergestellt. Nur die elePHPants, die auf dem Originalentwurf von Vincent Pontier basieren, werden von der Gemeinschaft als offiziell angesehen. Diese sind sammelwürdig und einige von ihnen sind extrem selten.

Syntax

Eine "Hello World"-Anwendung in PHP 7.4, die auf dem eingebauten Entwicklungsserver läuft

Das folgende "Hello, World!"-Programm ist in PHP-Code geschrieben, der in ein HTML-Dokument eingebettet ist:

Da es jedoch keine Vorschrift gibt, dass PHP-Code in HTML eingebettet sein muss, kann die einfachste Version von Hello, World! wie folgt geschrieben werden, wobei der schließende Tag

weggelassen werden, wie es in Dateien mit reinem PHP-Code bevorzugt wird.

Der PHP-Interpreter führt PHP-Code nur innerhalb seiner Begrenzungszeichen aus. Alles, was sich außerhalb der Begrenzungszeichen befindet, wird von PHP nicht verarbeitet, obwohl Nicht-PHP-Text weiterhin den im PHP-Code beschriebenen Kontrollstrukturen unterliegt. Die gebräuchlichsten Begrenzungszeichen sind

zum Öffnen und

um PHP-Abschnitte zu schließen. Die verkürzte Form

existiert ebenfalls. Dieses kurze Begrenzungszeichen macht Skriptdateien weniger portabel, da die Unterstützung dafür in der lokalen PHP-Konfiguration deaktiviert werden kann, und wird daher nicht empfohlen. Umgekehrt gibt es keine Empfehlung gegen den echo short tag

. Vor PHP 5.4.0 funktionierte diese kurze Syntax für

nur bei aktivierter short_open_tag-Konfigurationseinstellung, während sie ab PHP 5.4.0 immer verfügbar ist. Der Zweck all dieser Begrenzungszeichen ist es, PHP-Code von Nicht-PHP-Inhalten wie JavaScript-Code oder HTML-Markup zu trennen. Das kürzeste in PHP geschriebene "Hello, World!"-Programm ist also:

Die erste Form der Begrenzungszeichen,

und

in XHTML- und anderen XML-Dokumenten, erzeugt korrekt geformte XML-Verarbeitungsanweisungen. Das bedeutet, dass die resultierende Mischung aus PHP-Code und anderem Markup in der serverseitigen Datei selbst wohlgeformtes XML ist.

Variablen wird ein Dollar-Symbol vorangestellt, und ein Typ muss nicht im Voraus angegeben werden. Mit PHP 5 wurden Typdeklarationen eingeführt, mit denen Funktionen ihre Parameter zwingen können, Objekte einer bestimmten Klasse, Arrays, Schnittstellen oder Callback-Funktionen zu sein. Vor PHP 7 konnten Typendeklarationen jedoch nicht mit skalaren Typen wie Integer oder String verwendet werden.

Im Folgenden sehen Sie ein Beispiel dafür, wie PHP-Variablen deklariert und initialisiert werden.

Im Gegensatz zu Funktions- und Klassennamen wird bei Variablennamen zwischen Groß- und Kleinschreibung unterschieden. Sowohl Strings in doppelten Anführungszeichen ("") als auch heredoc-Strings bieten die Möglichkeit, den Wert einer Variablen in den String zu interpolieren. PHP behandelt Zeilenumbrüche wie Leerzeichen in einer Freiformsprache, und Anweisungen werden mit einem Semikolon abgeschlossen. PHP hat drei Arten von Kommentarsyntaxen:

Markierungen, Block- und Inline-Kommentare;

oder

werden für einzeilige Kommentare verwendet. Die echo-Anweisung ist eine von mehreren Möglichkeiten, die PHP zur Ausgabe von Text bietet. Was die Schlüsselwörter und die Sprachsyntax angeht, ähnelt PHP der Syntax von C.

Bedingungen,

und

Schleifen und Funktionsrückgaben sind in der Syntax ähnlich wie in Sprachen wie C, C++, C#, Java und Perl.

Datentypen

PHP ist locker typisiert. Es speichert ganze Zahlen in einem plattformabhängigen Bereich, entweder als 32-, 64- oder 128-Bit-Ganzzahl mit Vorzeichen, die dem Long-Typ in der Sprache C entspricht. Ganzzahlen ohne Vorzeichen werden in bestimmten Situationen in vorzeichenbehaftete Werte umgewandelt, was ein anderes Verhalten als in vielen anderen Programmiersprachen ist. Ganzzahlige Variablen können in dezimaler (positiv und negativ), oktaler, hexadezimaler und binärer Schreibweise zugewiesen werden.

Fließkommazahlen werden ebenfalls in einem plattformspezifischen Bereich gespeichert. Sie können in Fließkomma-Notation oder in zwei Formen der wissenschaftlichen Notation angegeben werden. PHP verfügt über einen nativen booleschen Typ, der den nativen booleschen Typen in Java und C++ ähnlich ist. Unter Verwendung der Konvertierungsregeln für boolesche Typen werden Werte ungleich Null als wahr und Null als falsch interpretiert, wie in Perl und C++.

Der Datentyp null stellt eine Variable dar, die keinen Wert hat; NULL ist der einzige zulässige Wert für diesen Datentyp.

Variablen vom Typ "Ressource" stellen Verweise auf Ressourcen aus externen Quellen dar. Diese werden typischerweise von Funktionen einer bestimmten Erweiterung erstellt und können nur von Funktionen derselben Erweiterung verarbeitet werden; Beispiele sind Datei-, Bild- und Datenbankressourcen.

Arrays können Elemente jedes Typs enthalten, den PHP verarbeiten kann, einschließlich Ressourcen, Objekte und sogar andere Arrays. Die Reihenfolge wird in Listen von Werten und in Hashes mit Schlüsseln und Werten beibehalten, und die beiden können miteinander vermischt werden. PHP unterstützt auch Strings, die mit einfachen Anführungszeichen, doppelten Anführungszeichen, nowdoc- oder heredoc-Syntax verwendet werden können.

Die Standard PHP Library (SPL) versucht, Standardprobleme zu lösen und implementiert effiziente Datenzugriffsschnittstellen und Klassen.

Funktionen

PHP definiert eine große Anzahl von Funktionen in der Kernsprache und viele sind auch in verschiedenen Erweiterungen verfügbar; diese Funktionen sind in der Online-PHP-Dokumentation gut dokumentiert. Die eingebaute Bibliothek weist jedoch eine Vielzahl von Namenskonventionen und damit verbundenen Inkonsistenzen auf, wie oben unter Geschichte beschrieben.

Benutzerdefinierte Funktionen können von den Entwicklern definiert werden:

Im Jahr 2022 lautet die Ausgabe des obigen Beispielprogramms "Ich bin derzeit 27 Jahre alt".

Anstelle von Funktionszeigern können Funktionen in PHP durch einen String referenziert werden, der ihren Namen enthält. Auf diese Weise können normale PHP-Funktionen z.B. als Callbacks oder innerhalb von Funktionstabellen verwendet werden. Benutzerdefinierte Funktionen können jederzeit erstellt werden, ohne dass ein Prototyp erstellt wird. Funktionen können innerhalb von Codeblöcken definiert werden, so dass zur Laufzeit entschieden werden kann, ob eine Funktion definiert werden soll oder nicht. Es gibt eine function_exists-Funktion, die feststellt, ob eine Funktion mit einem bestimmten Namen bereits definiert wurde. Funktionsaufrufe müssen Klammern verwenden, mit Ausnahme von Klassen-Konstruktorfunktionen ohne Argumente, die mit dem PHP-Operator new aufgerufen werden; in diesem Fall sind Klammern optional.

Seit PHP 4.0.1 erlaubt create_function(), ein dünner Wrapper um eval(), die Erstellung normaler PHP-Funktionen während der Programmausführung; es wurde in PHP 7.2 veraltet und in PHP 8.0 zugunsten einer Syntax für anonyme Funktionen oder "Closures", die Variablen aus dem umgebenden Bereich erfassen können, entfernt, die in PHP 5.3 hinzugefügt wurde. Die Syntax für Kurzpfeile wurde in PHP 7.4 hinzugefügt:

Im obigen Beispiel erzeugt die Funktion getAdder() eine Closure mit dem übergebenen Argument $x (das Schlüsselwort use importiert eine Variable aus dem lexikalischen Kontext), die ein zusätzliches Argument $y annimmt und die erzeugte Closure an den Aufrufer zurückgibt. Eine solche Funktion ist ein Objekt erster Klasse, d.h. sie kann in einer Variablen gespeichert, als Parameter an andere Funktionen übergeben werden usw.

Ungewöhnlich für eine dynamisch typisierte Sprache, unterstützt PHP Typendeklarationen für Funktionsparameter, die zur Laufzeit erzwungen werden. Dies wird seit PHP 5.0 für Klassen und Schnittstellen, seit PHP 5.1 für Arrays, seit PHP 5.4 für "callables" und seit PHP 7.0 für skalare Typen (integer, float, string und boolean) unterstützt. In PHP 7.0 gibt es auch Typendeklarationen für Funktionsrückgabetypen, die durch die Angabe des Typnamens nach der Liste der Parameter und einem vorangestellten Doppelpunkt ausgedrückt werden. Die Funktion getAdder aus dem vorigen Beispiel könnte in PHP 7 auf diese Weise mit Typen annotiert werden:

Standardmäßig folgen skalare Typendeklarationen den Prinzipien der schwachen Typisierung. Wenn also ein Parameter vom Typ int ist, erlaubt PHP nicht nur Ganzzahlen, sondern auch konvertierbare numerische Strings, Floats oder Booleans, die an die Funktion übergeben werden, und konvertiert sie. PHP 7 verfügt jedoch über einen "strict typing"-Modus, der solche Konvertierungen für Funktionsaufrufe und -rückgaben innerhalb einer Datei nicht zulässt.

Der Datentyp einer Variablen wird üblicherweise nicht vom Programmierer im Quellcode bestimmt, sondern automatisch während der Laufzeit. Er ergibt sich aus dem Kontext, in dem eine Variable benutzt wird. Explizite Typumwandlungen sind möglich. Ab Version 7 können Funktionen auch einfache Typen für ihre Parameter und ihren Rückgabewert vorschreiben – für Argumente, die Arrays oder Klassen beinhalten, war dies bereits vorher möglich.

// Skalare Datentypen
$wahrheitswert = true;         // boolean
$ganzzahl = 5;                 // integer
$kommazahl = 4.71;             // float (oder double)
$zeichenkette = 'foo';         // string <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Datentypen&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PHP#Datentypen <span style="color:#dddddd">ⓘ</span>]</span>

// Zusammengesetzte Datentypen
$feld = array('foo', 'bar');   // array
$objekt = new stdClass();      // object
$funktion = function () {      // callable
    echo 'hello world!';
}; <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Datentypen&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PHP#Datentypen <span style="color:#dddddd">ⓘ</span>]</span>

// Spezielle Datentypen
$resource = fopen("foo", "w"); // resource
$variable = NULL;              // NULL

PHP-Objekte

Grundlegende objektorientierte Programmierfunktionen wurden in PHP 3 hinzugefügt und in PHP 4 verbessert. Dadurch konnte PHP weiter abstrahiert werden, was kreative Aufgaben für Programmierer, die die Sprache verwenden, einfacher machte. Für PHP 5 wurde der Umgang mit Objekten komplett neu geschrieben, wodurch der Funktionsumfang erweitert und die Leistung verbessert wurde. In früheren Versionen von PHP wurden Objekte wie Wertetypen behandelt. Der Nachteil dieser Methode war, dass der Code viel Gebrauch von PHPs Referenzvariablen machen musste, wenn er ein übergebenes Objekt ändern wollte, anstatt eine Kopie davon zu erstellen. Bei der neuen Methode werden Objekte über den Handle referenziert und nicht über den Wert.

PHP 5 führte private und geschützte Mitgliedsvariablen und Methoden ein, sowie abstrakte Klassen, finale Klassen, abstrakte Methoden und finale Methoden. Außerdem wurde ein Standardverfahren für die Deklaration von Konstruktoren und Destruktoren eingeführt, ähnlich dem anderer objektorientierter Sprachen wie C++, sowie ein Standardmodell für die Behandlung von Ausnahmen. Darüber hinaus fügte PHP 5 Schnittstellen hinzu und ermöglichte die Implementierung mehrerer Schnittstellen. Es gibt spezielle Schnittstellen, die es Objekten ermöglichen, mit dem Laufzeitsystem zu interagieren. Objekte, die ArrayAccess implementieren, können mit der Array-Syntax verwendet werden und Objekte, die Iterator oder IteratorAggregate implementieren, können mit dem foreach-Sprachkonstrukt verwendet werden. Es gibt keine virtuelle Tabellenfunktion in der Engine, so dass statische Variablen zur Kompilierungszeit mit einem Namen anstelle einer Referenz gebunden werden.

Wenn der Entwickler eine Kopie eines Objekts mit dem reservierten Wort clone erstellt, prüft die Zend Engine ob eine __clone() Methode definiert wurde. Wenn nicht, wird sie eine standardmäßige __clone() aufrufen, die die Eigenschaften des Objekts kopiert. Wenn eine __clone() Methode definiert ist, dann ist diese für das Setzen der notwendigen Eigenschaften im erstellten Objekt verantwortlich. Der Einfachheit halber liefert die Engine eine Funktion, die die Eigenschaften des Quellobjekts importiert, so dass der Programmierer mit einer wertgleichen Kopie des Quellobjekts beginnen und nur die Eigenschaften überschreiben kann, die geändert werden müssen.

Die Sichtbarkeit von PHP-Eigenschaften und -Methoden wird durch die Schlüsselwörter public, private und protected definiert. Der Standardwert ist public, wenn nur var verwendet wird; var ist ein Synonym für public. Auf Elemente, die als public deklariert sind, kann überall zugegriffen werden. protected beschränkt den Zugriff auf geerbte Klassen (und auf die Klasse, die das Element definiert). private beschränkt die Sichtbarkeit nur auf die Klasse, die das Element definiert. Objekte desselben Typs haben Zugriff auf die privaten und geschützten Mitglieder des jeweils anderen, auch wenn es sich nicht um dieselbe Instanz handelt.

Beispiel

Im Folgenden finden Sie ein grundlegendes Beispiel für objektorientierte Programmierung in PHP 8:

PHP und HTML

Ein PHP-Skript lässt sich in HTML integrieren.

<!DOCTYPE HTML>
<html>
   <head>
       <title>Hallo-Welt-Beispiel</title>
   </head>
   <body>
       <?php echo 'Hallo Welt!'; ?>
   </body>
</html> <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;PHP und HTML&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PHP#PHP_und_HTML <span style="color:#dddddd">ⓘ</span>]</span>

Einbindung von Dateien

In ein PHP-Skript können externe Dateien eingebunden werden. Dazu gibt es vier verschiedene Anweisungen.

require 'pfad/datei.php';      // wenn die Datei nicht eingebunden werden kann, folgt ein Fehler
include 'pfad/datei.php';      // wenn die Datei nicht eingebunden werden kann, folgt eine Warnung
require_once 'pfad/datei.php'; // bindet die Datei nur ein, wenn sie zuvor noch nicht eingebunden wurde
include_once 'pfad/datei.php'; // bindet die Datei nur ein, wenn sie zuvor noch nicht eingebunden wurde <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Einbindung von Dateien&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PHP#Einbindung_von_Dateien <span style="color:#dddddd">ⓘ</span>]</span>

Konstanten

Konstanten müssen in PHP deklariert werden. Sie werden mittels define('name', wert); global oder in Klassen mittels const name = wert; lokal erzeugt. Seit PHP 7.1 können Klassenkonstanten auch eine Sichtbarkeit besitzen (ohne explizite Angabe sind sie wie in früheren PHP-Versionen automatisch public). Gängige Praxis ist es, Konstantennamen in Großbuchstaben zu schreiben, dies ist jedoch nicht von der Sprache vorgeschrieben.

define('MEINE_KONSTANTE', 'wert'); <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Konstanten&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PHP#Konstanten <span style="color:#dddddd">ⓘ</span>]</span>

class MyClass
{
    protected const KLASSEN_KONSTANTE = 420;
}

Eine Konstante kann nachträglich nicht editiert werden. Klassenkonstanten existieren einmalig pro Klasse, nicht pro Instanz der Klasse und verhalten sich somit wie statische Eigenschaften der Klasse.

Implementierungen

Die einzige vollständige PHP-Implementierung ist das Original, einfach als PHP bekannt. Sie ist die am weitesten verbreitete und wird von der Zend Engine unterstützt. Um es von anderen Implementierungen abzugrenzen, wird es manchmal inoffiziell "Zend PHP" genannt. Die Zend Engine kompiliert den PHP-Quellcode in ein internes Format, das sie ausführen kann, und arbeitet somit als Interpreter. Sie ist auch die "Referenzimplementierung" von PHP, da PHP keine formale Spezifikation hat und somit die Semantik von Zend PHP die Semantik von PHP definiert. Aufgrund der komplexen und nuancierten Semantik von PHP, die durch die Arbeitsweise von Zend definiert ist, ist es für konkurrierende Implementierungen schwierig, vollständige Kompatibilität zu bieten.

Das Single-Request-pro-Skript-Ausführungsmodell von PHP und die Tatsache, dass die Zend Engine ein Interpreter ist, führt zu Ineffizienz; daher wurden verschiedene Produkte entwickelt, um die PHP-Leistung zu verbessern. Um die Ausführungszeit zu beschleunigen und den PHP-Quellcode nicht jedes Mal kompilieren zu müssen, wenn die Webseite aufgerufen wird, können PHP-Skripte auch im internen Format der PHP-Engine bereitgestellt werden, indem ein Opcode-Cache verwendet wird, der die kompilierte Form eines PHP-Skripts (Opcodes) im gemeinsamen Speicher zwischenspeichert, um den Overhead des Parsens und Kompilierens des Codes bei jeder Ausführung des Skripts zu vermeiden. Ein Opcode-Cache, Zend Opcache, ist seit Version 5.5 in PHP integriert. Ein weiteres Beispiel für einen weit verbreiteten Opcode-Cache ist der Alternative PHP Cache (APC), der als PECL-Erweiterung verfügbar ist.

Während Zend PHP immer noch die beliebteste Implementierung ist, wurden mehrere andere Implementierungen entwickelt. Einige von ihnen sind Compiler oder unterstützen JIT-Kompilierung und bieten daher Leistungsvorteile gegenüber Zend PHP auf Kosten der fehlenden vollständigen PHP-Kompatibilität. Zu den alternativen Implementierungen gehören die folgenden:

  • HHVM (HipHop Virtual Machine) - wurde von Facebook entwickelt und ist als Open Source verfügbar. Sie konvertiert PHP-Code in einen High-Level-Bytecode (allgemein als Zwischensprache bekannt), der dann zur Laufzeit durch einen Just-in-Time-Compiler (JIT) dynamisch in x86-64-Maschinencode übersetzt wird, was zu einer bis zu 6-fachen Leistungssteigerung führt. Seit Version 7.2 ist Zend jedoch leistungsfähiger als HHVM, und HHVM 3.24 ist die letzte Version, die PHP offiziell unterstützt.
  • Parrot - eine virtuelle Maschine, die für die effiziente Ausführung dynamischer Sprachen entwickelt wurde; Pipp wandelt den PHP-Quellcode in die Parrot-Zwischendarstellung um, die dann in den Bytecode von Parrot übersetzt und von der virtuellen Maschine ausgeführt wird.
  • PeachPie - ein Compiler der zweiten Generation für .NET Common Intermediate Language (CIL) Bytecode, der auf der Roslyn-Plattform aufgebaut ist; Nachfolger von Phalanger, der mehrere Architekturkomponenten gemeinsam hat
  • Phalanger - kompiliert PHP in .Net Common Intermediate Language Bytecode; Vorgänger von PeachPie
  • Quercus - kompiliert PHP in Java Bytecode
  • HipHop - von Facebook entwickelt und als Open Source verfügbar, wandelt es die PHP-Skripte in C++-Code um und kompiliert dann den resultierenden Code, wodurch die Serverlast um bis zu 50 % reduziert wird. Anfang 2013 wurde es von Facebook zugunsten von HHVM aus verschiedenen Gründen abgeschafft, u. a. wegen Schwierigkeiten bei der Bereitstellung und mangelnder Unterstützung für die gesamte PHP-Sprache, einschließlich der Konstrukte create_function() und eval().

Lizenzierung

PHP ist freie Software, die unter der PHP-Lizenz veröffentlicht wird, die Folgendes festlegt:

Produkte, die von dieser Software abgeleitet sind, dürfen nicht "PHP" genannt werden, noch darf "PHP" in ihrem Namen erscheinen, ohne vorherige schriftliche Genehmigung von group@php.net. Sie können darauf hinweisen, dass Ihre Software in Verbindung mit PHP arbeitet, indem Sie "Foo for PHP" sagen, anstatt sie "PHP Foo" oder "phpfoo" zu nennen.

Diese Einschränkung der Verwendung von "PHP" macht die PHP-Lizenz inkompatibel mit der General Public License (GPL), während die Zend-Lizenz aufgrund einer Werbeklausel ähnlich der der ursprünglichen BSD-Lizenz inkompatibel ist.

Entwicklung und Gemeinschaft

PHP enthält verschiedene freie und quelloffene Bibliotheken in seiner Quelldistribution oder verwendet sie in den daraus resultierenden PHP-Binary-Builds. PHP ist im Wesentlichen ein internetfähiges System mit eingebauten Modulen für den Zugriff auf File Transfer Protocol (FTP)-Server und viele Datenbankserver, einschließlich PostgreSQL, MySQL, Microsoft SQL Server und SQLite (eine eingebettete Datenbank), LDAP-Server und andere. Zahlreiche Funktionen, die C-Programmierern vertraut sind, wie z.B. die der stdio-Familie, sind in den Standard-PHP-Builds verfügbar.

PHP erlaubt es Entwicklern, Erweiterungen in C zu schreiben, um die PHP-Sprache um weitere Funktionen zu ergänzen. PHP-Erweiterungen können statisch in PHP kompiliert oder dynamisch zur Laufzeit geladen werden. Zahlreiche Erweiterungen wurden geschrieben, um die Unterstützung für die Windows-API, die Prozessverwaltung auf Unix-ähnlichen Betriebssystemen, Multibyte-Strings (Unicode), cURL und mehrere gängige Kompressionsformate hinzuzufügen. Weitere PHP-Funktionen, die durch Erweiterungen verfügbar gemacht wurden, sind die Integration mit Internet Relay Chat (IRC), die dynamische Erzeugung von Bildern und Adobe Flash-Inhalten, PHP Data Objects (PDO) als Abstraktionsschicht für den Zugriff auf Datenbanken und sogar Sprachsynthese. Einige der Kernfunktionen der Sprache, wie der Umgang mit Strings und Arrays, sind auch als Erweiterungen implementiert. Das Projekt PHP Extension Community Library (PECL) ist ein Repository für Erweiterungen der PHP-Sprache.

Einige andere Projekte, wie z.B. Zephir, bieten die Möglichkeit, PHP-Erweiterungen in einer Hochsprache zu erstellen und in native PHP-Erweiterungen zu kompilieren. Ein solcher Ansatz, anstatt PHP-Erweiterungen direkt in C zu schreiben, vereinfacht die Entwicklung von Erweiterungen und reduziert den Zeitaufwand für Programmierung und Tests.

Im Dezember 2018 bestand die PHP-Gruppe aus zehn Personen: Thies C. Arntzen, Stig Bakken, Shane Caraveo, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, und Andrei Zmievski.

Zend Technologies bietet eine PHP-Zertifizierung an, die auf der PHP 7-Prüfung basiert (und vorher auf PHP 5.5), damit Programmierer zertifizierte PHP-Entwickler werden können.

PHP-Stiftung

Am 26. November 2021 kündigte der JetBrains-Blog die Gründung der PHP Foundation an, die das Design und die Entwicklung von PHP unterstützen wird.

Installation und Konfiguration

Beispiel für die Ausgabe der Funktion phpinfo() in PHP 7.1

Es gibt zwei primäre Möglichkeiten, einem Webserver Unterstützung für PHP hinzuzufügen - als natives Webservermodul oder als ausführbare CGI-Datei. PHP verfügt über eine direkte Modulschnittstelle namens Server Application Programming Interface (SAPI), die von vielen Webservern wie Apache HTTP Server, Microsoft IIS und iPlanet Web Server unterstützt wird. Einige andere Webserver, wie z.B. OmniHTTPd, unterstützen das Internet Server Application Programming Interface (ISAPI), das Microsofts Webserver-Modulschnittstelle ist. Wenn PHP keine Modulunterstützung für einen Webserver hat, kann es immer als Common Gateway Interface (CGI) oder FastCGI-Prozessor verwendet werden; in diesem Fall wird der Webserver so konfiguriert, dass er das CGI-Programm von PHP verwendet, um alle Anfragen an PHP-Dateien zu bearbeiten.

PHP-FPM (FastCGI Process Manager) ist eine alternative FastCGI-Implementierung für PHP, die der offiziellen PHP-Distribution seit Version 5.3.3 beiliegt. Im Vergleich zur älteren FastCGI-Implementierung enthält sie einige zusätzliche Funktionen, die vor allem für stark belastete Webserver nützlich sind.

Wenn Sie PHP für Befehlszeilenskripte verwenden, benötigen Sie eine ausführbare PHP-Befehlszeilenschnittstelle (CLI). PHP unterstützt seit PHP 4.3.0 ein CLI Server Application Programming Interface (SAPI). Der Schwerpunkt dieser SAPI liegt auf der Entwicklung von Shell-Anwendungen mit PHP. Es gibt einige Unterschiede zwischen der CLI-SAPI und anderen SAPIs, obwohl sie viele der gleichen Verhaltensweisen aufweisen.

PHP verfügt über eine direkte Modulschnittstelle, SAPI genannt, für verschiedene Webserver; im Falle von PHP 5 und Apache 2.0 auf Windows wird sie in Form einer DLL-Datei namens php5apache2.dll bereitgestellt, die ein Modul ist, das neben anderen Funktionen eine Schnittstelle zwischen PHP und dem Webserver bietet, die in einer Form implementiert ist, die der Server versteht. Diese Form wird als SAPI bezeichnet.

Es gibt verschiedene Arten von SAPIs für verschiedene Webserver-Erweiterungen. Zu den oben genannten SAPIs für die Sprache PHP gehören beispielsweise das Common Gateway Interface und die Befehlszeilenschnittstelle.

Mit der PHP-GTK-Erweiterung kann PHP auch zum Schreiben von Anwendungen mit grafischer Benutzeroberfläche (GUI) verwendet werden. PHP-GTK ist nicht in der offiziellen PHP-Distribution enthalten und kann als Erweiterung nur mit den PHP-Versionen 5.1.0 und neuer verwendet werden. Die gängigste Art, PHP-GTK zu installieren, ist die Kompilierung aus dem Quellcode.

Wenn PHP in Cloud-Umgebungen installiert und verwendet wird, werden Software Development Kits (SDKs) für die Nutzung Cloud-spezifischer Funktionen bereitgestellt. Ein Beispiel:

  • Amazon Web Services stellt das AWS SDK für PHP zur Verfügung.
  • Microsoft Azure kann mit dem Windows Azure SDK für PHP genutzt werden.

Es werden zahlreiche Konfigurationsoptionen unterstützt, die sowohl die Kernfunktionen von PHP als auch Erweiterungen betreffen. Die Konfigurationsdatei php.ini wird an verschiedenen Stellen gesucht, je nachdem, wie PHP verwendet wird. Die Konfigurationsdatei ist in verschiedene Abschnitte unterteilt, wobei einige der Konfigurationsoptionen auch innerhalb der Webserverkonfiguration eingestellt werden können.

verwenden

Ein breiter Überblick über das LAMP-Softwarepaket, hier zusammen mit Squid dargestellt

PHP ist eine Allzweck-Skriptsprache, die sich besonders für die serverseitige Webentwicklung eignet, wobei PHP im Allgemeinen auf einem Webserver läuft. Jeder PHP-Code in einer angeforderten Datei wird von der PHP-Laufzeitumgebung ausgeführt, in der Regel um dynamische Webseiteninhalte oder dynamische Bilder zu erstellen, die auf Websites oder anderswo verwendet werden. Es kann auch für Befehlszeilenskripte und clientseitige Anwendungen mit grafischer Benutzeroberfläche (GUI) verwendet werden. PHP kann auf den meisten Webservern, vielen Betriebssystemen und Plattformen eingesetzt werden und kann mit vielen relationalen Datenbankmanagementsystemen (RDBMS) verwendet werden. Die meisten Webhosting-Anbieter unterstützen PHP für die Nutzung durch ihre Kunden. Es ist kostenlos erhältlich, und die PHP Group stellt den vollständigen Quellcode zur Verfügung, den die Benutzer für ihre eigene Verwendung erstellen, anpassen und erweitern können.

Dynamische Webseite: Beispiel für serverseitiges Scripting (PHP und MySQL)

Ursprünglich für die Erstellung dynamischer Webseiten entwickelt, konzentriert sich PHP heute hauptsächlich auf serverseitiges Scripting und ähnelt anderen serverseitigen Scripting-Sprachen, die dynamische Inhalte von einem Webserver zu einem Client übertragen, wie z.B. Microsofts ASP.NET, Sun Microsystems' JavaServer Pages und mod_perl. PHP hat auch die Entwicklung vieler Software-Frameworks angezogen, die Bausteine und eine Designstruktur zur Förderung der schnellen Anwendungsentwicklung (RAD) bereitstellen. Dazu gehören PRADO, CakePHP, Symfony, CodeIgniter, Laravel, Yii Framework, Phalcon und Laminas, die ähnliche Funktionen wie andere Web-Frameworks bieten.

Die LAMP-Architektur hat sich in der Webbranche als Methode für die Bereitstellung von Webanwendungen durchgesetzt. PHP wird üblicherweise als das P in diesem Paket neben Linux, Apache und MySQL verwendet, obwohl sich das P auch auf Python, Perl oder eine Mischung aus diesen drei Sprachen beziehen kann. Ähnliche Pakete, WAMP und MAMP, gibt es auch für Windows und macOS, wobei der erste Buchstabe für das jeweilige Betriebssystem steht. Obwohl sowohl PHP als auch Apache als Teil der macOS-Basisinstallation bereitgestellt werden, suchen die Nutzer dieser Pakete einen einfacheren Installationsmechanismus, der leichter auf dem neuesten Stand gehalten werden kann.

Für spezielle und fortgeschrittene Anwendungsszenarien bietet PHP eine gut definierte und dokumentierte Möglichkeit, eigene Erweiterungen in C oder C++ zu schreiben. Neben der Erweiterung der Sprache selbst in Form zusätzlicher Bibliotheken bieten Erweiterungen eine Möglichkeit, die Ausführungsgeschwindigkeit dort zu verbessern, wo sie kritisch ist und es Raum für Verbesserungen durch die Verwendung einer echten kompilierten Sprache gibt. PHP bietet auch gut definierte Möglichkeiten, sich in andere Softwareprojekte einzubetten. Auf diese Weise kann PHP einfach als interne Skriptsprache für ein anderes Projekt verwendet werden und bietet gleichzeitig eine enge Schnittstelle zu den spezifischen internen Datenstrukturen des Projekts.

PHP erhielt gemischte Kritiken aufgrund der fehlenden Unterstützung für Multithreading auf der Ebene der Kernsprache, obwohl die Verwendung von Threads durch die PECL-Erweiterung "pthreads" ermöglicht wird.

Es wurden eine Kommandozeilenschnittstelle, php-cli, und zwei ActiveX Windows Script Host Skripting Engines für PHP entwickelt.

Popularität und Nutzungsstatistiken

PHP wird für Web-Content-Management-Systeme wie MediaWiki, WordPress, Joomla, Drupal, Moodle, eZ Publish, eZ Platform und SilverStripe verwendet.

Im Januar 2013 wurde PHP auf mehr als 240 Millionen Websites eingesetzt (39 % der untersuchten Websites) und war auf 2,1 Millionen Webservern installiert.

Im März 2021 wurde PHP als serverseitige Programmiersprache auf 79,1 % der Websites verwendet, gegenüber 83,5 % zuvor, bei denen die Sprache ermittelt werden konnte, und PHP 7 ist die am häufigsten verwendete Version der Sprache: 50,3 % aller Websites im Internet verwenden diese Version.

Das LAMP-Software-Bündel (hier zusätzlich mit Squid) umfasst PHP.

Sicherheit

Im Jahr 2019 waren 11 % aller in der National Vulnerability Database aufgelisteten Sicherheitslücken mit PHP verknüpft; in der Vergangenheit waren etwa 30 % aller seit 1996 in dieser Datenbank aufgeführten Sicherheitslücken mit PHP verknüpft. Technische Sicherheitslücken in der Sprache selbst oder in ihren Kernbibliotheken sind nicht häufig (22 im Jahr 2009, etwa 1 % der Gesamtzahl, obwohl PHP auf etwa 20 % der aufgeführten Programme zutrifft). In der Erkenntnis, dass Programmierer Fehler machen, enthalten einige Sprachen eine Taint-Prüfung, um automatisch die fehlende Eingabevalidierung zu erkennen, die zu vielen Problemen führt. Eine solche Funktion wird derzeit für PHP entwickelt, aber ihre Aufnahme in eine Version wurde in der Vergangenheit mehrfach abgelehnt.

Es gibt fortgeschrittene Schutzpatches wie Suhosin und Hardening-Patch, die speziell für Webhosting-Umgebungen entwickelt wurden.

In der Vergangenheit hatten alte PHP-Versionen einige Konfigurationsparameter und Standardwerte für solche Laufzeiteinstellungen, die einige PHP-Anwendungen anfällig für Sicherheitsprobleme machten. Unter diesen waren die Konfigurationsdirektiven magic_quotes_gpc und register_globals am bekanntesten; letztere machten alle URL-Parameter zu PHP-Variablen, was einem Angreifer die Möglichkeit gab, den Wert einer beliebigen nicht initialisierten globalen Variablen zu setzen und die Ausführung eines PHP-Skripts zu stören, was zu ernsthaften Sicherheitslücken führte. Die Unterstützung für "magische Anführungszeichen" und "register globals"-Einstellungen ist seit PHP 5.3.0 veraltet und wurde mit PHP 5.4.0 entfernt.

Ein weiteres Beispiel für eine potenzielle Schwachstelle in den Laufzeiteinstellungen ist das Versäumnis, die PHP-Ausführung (z. B. durch Verwendung der Engine-Konfigurationsanweisung) für das Verzeichnis zu deaktivieren, in dem die hochgeladenen Dateien gespeichert sind; die Aktivierung kann zur Ausführung von in die hochgeladenen Dateien eingebettetem bösartigen Code führen. Die beste Vorgehensweise besteht darin, entweder das Bildverzeichnis außerhalb des für den Webserver verfügbaren Dokumentenstamms zu platzieren und es über ein Zwischenskript bereitzustellen oder die PHP-Ausführung für das Verzeichnis zu deaktivieren, in dem die hochgeladenen Dateien gespeichert sind.

Auch die Aktivierung des dynamischen Ladens von PHP-Erweiterungen (über die Konfigurationsanweisung enable_dl) in einer gemeinsam genutzten Webhosting-Umgebung kann zu Sicherheitsproblemen führen.

Implizite Typkonvertierungen, die dazu führen, dass unterschiedliche Werte als gleichwertig behandelt werden, können - manchmal entgegen der Absicht des Programmierers - zu Sicherheitsproblemen führen. Zum Beispiel ist das Ergebnis des Vergleichs '0e1234' == '0' wahr, weil Zeichenketten, die als Zahlen analysiert werden können, in Zahlen umgewandelt werden; in diesem Fall wird der erste verglichene Wert als wissenschaftliche Notation mit dem Wert (0×101234) behandelt, was Null ist. Fehler wie dieser führten zu Authentifizierungsschwachstellen in Simple Machines Forum, Typo3 und phpBB, wenn MD5-Passwort-Hashes verglichen wurden. Empfohlen wird die Verwendung von hash_equals() (für die Sicherheit von Zeitangriffen), strcmp oder des Identitätsoperators (===), da '0e1234' === '0' zu einem falschen Ergebnis führt.

In einer 2013 von Zone-H veröffentlichten Analyse von über 170.000 Website-Defacements war die am häufigsten (53 %) genutzte Technik die Ausnutzung einer Dateieinschluss-Schwachstelle, meist im Zusammenhang mit der unsicheren Verwendung der PHP-Sprachkonstrukte include, require und allow_url_fopen.

Im April 2021 meldete W3Techs, dass 64 % der Websites, die PHP verwenden, die Version 7.2 oder älter verwenden (die vom PHP Development Team nicht mehr unterstützt wird), während 35 % aller PHP-Websites verwenden die Version 5.6 oder älter.

Version 5 wird noch von 24,5 % aller Websites verwendet (September 2021). Es wird dringend empfohlen, auf PHP Version 7 oder 8 umzusteigen und random_int() anstelle von rand() oder mt_rand() zu verwenden, da die letztgenannten Funktionen kryptografisch nicht sicher sind. Es gibt zwei Angriffe, die mit PHP-Entropiequellen durchgeführt werden können: "Seed Attack" und "State Recovery Attack". Mit den aktuellen GPU-Technologien kann ein Angreifer mit einer 250-Dollar-GPU bis zu 2^30 MD5-Berechnungen pro Sekunde durchführen, während er mit einer zusätzlichen 500-Dollar-GPU bis zu 2^32 Berechnungen erreichen kann. In Kombination mit einem "Geburtstagsangriff" kann dies zu ernsthaften Sicherheitslücken führen.

Popularität

PHP ist in seiner ursprünglichen Form als web-zentrische Skriptsprache für Webdokumentvorlagen (Templates) konzipiert. Die weite Verbreitung des Apache Webservers und des passenden PHP Erweiterungsmoduls ermöglicht eine preiswerte und niederschwellige Bereitstellung von Webapplikationsumgebungen, auf denen Software als einfache Quelltextdateien schnell und unkompliziert über Standardprotokolle wie SFTP lauffertig ausgeliefert werden kann. Zudem ermöglicht die schrittweise Erweiterung von statischen Webdokumenten (HTML) mit kleinen Hilfsfunktionen und überschaubaren Logik-Blöcken einen leichten Einstieg in die serverseitige Webprogrammierung. Da der Einsatz von PHP als Template-Engine in dieser Form zustandsfrei ist und sich oft auf überschaubare Prozeduren beschränkt, entfallen bei der Programmierung in PHP in vielen Situationen auch schwierigere, tiefer gehende Problemstellungen der Informatik, wie zum Beispiel Speicher- und Prozessverwaltung oder die Notwendigkeit von Rückruffunktionen. Diese Eigenschaften sind auch mit Ursache für die weite Verbreitung und Popularität von PHP.

Verbreitete PHP-Applikationen

Eine Auswahl einiger weit verbreiteter Applikationen, die in PHP entwickelt wurden:

Foren-Software
Invision Power Board, XenForo, MyBB, phpBB, Simple Machines Forum, vBulletin und WoltLab Burning Board
Webframeworks
Laravel, Zend Framework, Symfony, CakePHP, CodeIgniter, Neos Flow, Horde, WoltLab Community Framework, Yii
Grafische Benutzeroberflächen zur Verwaltung von Datenbanken (zum Beispiel MySQL)
phpMyAdmin, phpPgAdmin
Content-Management- (CMS) und Blog-Systeme
WordPress, TYPO3, Joomla, Xoops, Drupal, Contao, WebEdition, Serendipity
Customer-Relationship-Management-Systeme (CRM)
SugarCRM und Vtiger
E-Commerce-Applikationen
osCommerce, Magento, PrestaShop, Pimcore, Shopware, OXID eShop
Projektmanagement
EGroupware
Bildergalerien
Coppermine, 4images, easyImage
Sonstige
MediaWiki, DokuWiki

Weiterentwicklungen

Datenbankanbindung

Mit der objektorientierten Datenbankabstraktionsebene PDO wurde dem oft bemängelten uneinheitlichen Zugriff auf verschiedene Datenbanken in der Version 5.1 entgegengewirkt.

Speicheroptimierung

In PHP 5.3 wurde eine deutliche Verbesserung der Speicheranforderung eines PHP-Skripts zur Laufzeit durch einen internen Garbage Collector erreicht. Seitdem ist eine Zusatzinstallation von Zend Optimizer nicht mehr notwendig.

Webserver

Ab Version 5.4 ist ein einfacher Webserver integriert, der über die Kommandozeile konfigurierbar ist. Er wird nicht für den Produktiveinsatz empfohlen.

Unicode

In der Version 5.6 wurde der Standard-Zeichensatz von ISO-8859-1 auf UTF-8 geändert. Um eine sichere Verarbeitung von Unicode zu gewährleisten, müssen die Multi-Byte-Varianten von stringverarbeitenden Funktionen verwendet werden. Also „mb_substr“ anstelle „substr“ oder „mb_strpos“ statt „strpos“. „mb“ steht für „multi byte“.

Sessions

In gewöhnlichen Variablen gespeicherte Daten sind nur innerhalb eines HTTP-Requests verfügbar (im sogenannten request scope) und werden am Ende des Seitenaufrufs aus dem Speicher gelöscht. Ein Besuch eines Nutzers besteht allerdings meist aus mehreren Seitenaufrufen. Um Daten wie etwa die Produkte in einem Einkaufswagen für eine ganze Sitzung verfügbar zu machen (im session scope), verwendet man Sessionvariablen. In der Standardkonfiguration speichert PHP die Sessiondaten im Dateisystem des Webservers. Daten, die sessionübergreifend verfügbar sein sollen (im application scope), müssen auf anderen Wegen auf dem Webserver abgespeichert werden.

Bewertung

Einige PHP-Module sind nicht threadsicher.

Die schwache Typisierung von PHP ist Teil des Konzepts, aber auch eine mögliche Fehlerquelle. Ein Fehler tritt etwa auf, wenn numerische Ausdrücke mit Zeichenkettenausdrücken verglichen werden sollen (Operator: ==), wobei es durch die implizite Typumwandlung zu unerwarteten Ergebnissen kommen kann, sofern kein Operator für typsichere Vergleiche (Operator: ===) verwendet wurde. Zudem ist es in PHP nicht möglich, eine Variablendeklaration zu erzwingen. Variablen werden vielmehr durch erstmalige Verwendung implizit deklariert. Dieser Komfort hat zur Folge, dass etwa Tippfehler im Variablennamen zu schwer auffindbaren Programmfehlern führen können. Um solche Probleme zu finden, kann das LogLevel E_NOTICE aktiviert werden. Dadurch wird beim Verwenden einer nicht initialisierten Variable eine Fehlermeldung ausgegeben.

Es kann vorkommen, dass Funktionen im Falle eines Fehlers keine Ausnahme auslösen. Dadurch ist keine standardisierte Fehlerbehandlung möglich. Mit Hilfe von „set_error_handler“ kann für diese Fälle eine individuelle Fehlerbehandlung definiert werden. Seit PHP 7 können viele fatale Fehler mittels Ausnahmebehandlung ähnlich wie Exceptions abgefangen werden.