PHP

Lesezeit: 8 Minuten

PHP ist eine interpretierte, dynamisch (optional) typisierte Programmiersprache und unterstützt objektorientierte, funktionale und aspektorientierte Programmierung. PHP ist 1994 von dem dänisch-kanadischen Entwickler Rasmus Lerdorf gestartet worden und war ursprünglich nicht als Programmiersprache gedacht. Die erste Version von PHP bestand aus einer Reihe von CGI-Programmen (Common Gateway Interface) und stand für Personal Home Page. Mit Version 3 im Jahre 1997 wurde der volle Name hinter PHP offiziell auf das rekursive Akronym PHP: Hypertext Preprocessor geändert.

Alleinstellungsmerkmale

Ursprünglich gestartet um den Betrieb seiner persönlichen Webseite zu unterstützen hat sich Rasmus Lerdorfs PHP zur populärsten Sprache für serverseitiges Skripting im Web entwickelt. Seit 1998 besteht der Begriff LAMP-Stack, der den gängigen Software-Stack für Webseiten bestehend aus dem Betriebssystem Linux, dem Webserver Apache, der Datenbank MySQL und der Sprache PHP (später auch Python und Perl) beschreibt. So gut wie jeder Webserver bietet Unterstützung für PHP.

PHP hat eine C-ähnliche Syntax und kann prozedural verwendet werden; die Typisierung ist optional. Zur hohen Verbreitung kommen eine große Community und ein riesiges Ökosystem an Bibliotheken. PHP-Code kann direkt mit HTML-Code vermischt werden. Insgesamt ist die Sprache sehr einsteigerfreundlich und ermöglicht auch Interessierten ohne Programmiererfahrung schnelle Erfolgserlebnisse.

Einsatzbereiche

PHP wird vorwiegend in der Webentwicklung, für dynamische Inhalte und serverseitiges Skripting eingesetzt, kann jedoch als General Purpose Language auch im Desktopbereich verwendet werden.

Etwa 80% aller Webseiten setzen PHP ein. Bekannte Dienste, die PHP verwenden, sind unter anderem Baidu, Dailymotion, Facebook, Flickr, iStock, Nextcloud, Slack, Spotify, Tumblr, Wikipedia und Yahoo.

Einige bekannte Content Management Systems (CMS) sind in PHP geschrieben, darunter Drupal, Joomla und WordPress. Einer Auswertung nach setzen etwa ein Drittel aller Internetseiten WordPress ein.

Pros

PHP ist eine sehr leicht zu erlernende und sehr flexible Sprache mit einer simplen Syntax, die sich direkt in HTML einbinden lässt. Die Bekanntheit der Sprache hat zu einer riesigen Community und einem ebenso großen Ökosystem an Bibliotheken geführt.

Die Dokumentation von PHP ist sehr umfangreich und gut. Viele Hoster haben sich auf PHP spezialisiert, so dass sich eine eigene Webseite mit dynamischen Inhalten betreiben lässt, ohne dass man sich selbst um den Betrieb eines Servers kümmern muss.

Für nahezu jedes Problem in PHP lässt sich online eine Lösung finden, sei es in Form von Code, den man direkt oder leicht angepasst übernehmen kann, oder in Form einer Bibliothek, die sich verwenden lässt. Für diverse relationale und nicht-relationale Datenspeicher existieren Bindings. Die Standardbibliothek besteht aus über eintausend built-in Funktionen.

PHP kommt mit einem Garbage Collector und einer REPL, so dass keine manuelle Speicherverwaltung notwendig ist und einzelne Anweisungen schnell interaktiv ausprobiert werden können. PHP ermöglicht die Ausführung von Systembefehlen und die Interaktion mit Named Pipes.

An der Syntax gefällt mir, dass einfache und assoziative Arrays nativ unterstützt werden, eine optionale Typisierung auch von Funktionsparametern und -rückgabewerten möglich ist, Variablen leicht an dem vorangestellten Dollar-Zeichen erkannt werden und in Strings eingebunden werden können (String Interpolation). Mir gefällt außerdem, dass für String-Konkatenierung ein Punkt als Operator verwendet wird, so dass der Additionsoperator nicht überladen wird, was in anderen Sprachen wie JavaScript schnell zu Missverständnissen und Fehlern führen kann.

Cons

Als interpretierte Sprache ist PHP langsamer als kompilierte Sprachen. In der Core-Bibliothek gibt es keine Unterstützung für Threads, eingesetzt als serverseitige Skriptsprache im Webbrowser wird aber üblicherweise für jeden Request ein eigener Prozess gestartet, so dass auch ein Webangebot mit PHP-Backend gut skalieren kann.

PHP beinhaltet eine sehr mächtige und umfangreiche Konfiguration der Sprache in der Datei php.ini. Diese Datei kann sich an verschiedenen Orten befinden und dazu führen, dass sich eine PHP-Software in verschiedenen Umgebungen unterschiedlich verhält. Als Entwickler von Cloud-Anwendungen und Befürworter der Twelve-Factor App kann ich diesem Ansatz nicht viel abgewinnen.

Im Gegensatz zu manchen anderen Sprachen wie Java ist PHP nicht abwärtskompatibel und jedes neue Major-Release wird von einer Reihe an Breaking Changes begleitet. Da die Sprache sehr organisch gewachsen ist und es viele Jahre lang keine Spezifikation gab, ist es im Laufe der Zeit zu einer Vielzahl an Inkonsistenzen und schlechten Design-Entscheidungen gekommen. Ein Artikel, der sich damit auseinandersetzt, ist am Ende dieses Blogbeitrags verlinkt.

Die inkonsistente Entwicklung gepaart mit dem leichten Einstieg in die Sprache hat auch dazu geführt, dass es sehr viel schlechten PHP-Code und vermeintlich auch viele weniger erfahrene PHP-Entwickler gibt, was schlecht für die Langlebigkeit komplexer Software ist und für viel Frust bei denjenigen Entwicklern sorgt, die eine solche Legacy-Anwendung warten und weiterentwickeln. Zwar kann man mit jeder Sprache vor dieser Herausforderung stehen, PHP ist aber meiner Meinung nach besonders anfällig dafür.

PHP kennt grundsätzlich nur zwei verschiedene Scopes: global und lokal innerhalb einer Funktion. Eine feingranularere Abstufung wie z.B. in Java gibt es nicht. Die Unterstützung objektorientierter Programmierung ist mit der Zeit besser geworden, für viele alltägliche Arbeitsschritte verwendet man aber einfach die Funktionen der Standardbibliothek und muss diese und ihre Parametrisierung kennen.

$list = [];
array_push($list, 'foo');
array_push($list, 'bar');
echo array_search('bar', $list);

Im Beispiel wird ein leeres Array $list erzeugt. Dieses Array bietet keine Property, um neue Einträge hinzuzufügen. Stattdessen wird eine globale Funktion array_push() verwendet, die als erstes Argument das Array und als zweites Argument den hinzuzufügenden Wert entgegennimmt. Möchte man im Anschluss verifizieren, dass der Wert nun in der Liste steht, kann man dafür die globale Funktion array_search() verwenden, die als erstes Argument den zu suchenden Wert und als zweites Argument das Array entgegennimmt, also genau umgekehrt. Die Ausgabe vom Echo-Statement ist übrigens 1, da 'bar' das zweite Element der Liste mit 0-basiertem Index ist.

natcasesort($list);
print_r($list);

Diese beiden Anweisungen tuen folgendes: natcasesort() ist eine globale Funktion, die ein Array natürlich, d.h. hier alphabetisch, sortiert. Im Gegensatz zu den anderen beiden Array-Funktionen trägt diese keine Unterstriche im Namen. Die globale Funktion print_r() stellt das Array in einer lesbaren Form dar und gibt es auf stdout aus. Der Versuch, das Array mit echo auszugeben würde hingegen zu einer Warnung führen.

PHP hat sich übrigens den Arrow-Operator „->“ von C ausgeborgt. Ich persönlich favorisiere den in vielen Sprachen üblichen Punkt-Operator, um auf Properties eines Objektes zuzugreifen.

PHP orientiert sich seit Version 5 an der Ausnahmebehandlung anderer Sprachen wie Java, Python und Ruby, das funktioniert aber nur dort, wo auch Exceptions geworfen werden, also z.B. nicht im folgenden Fall, wo ich auf der REPL mittels fopen() versuche, eine nicht-existente Datei zu öffnen:

php > try { $f = fopen('/tmpabc/1', 'r'); } catch(Exception $e) { echo 'Fehler'; }
PHP Warning:  fopen(/tmpabc/1): Failed to open stream: No such file or directory in php shell code on line 1

Datenblatt

NamePHP
Webseitehttps://www.php.net/
Erscheinungsjahr1995
Aktuellste Version (Stand 29. August 2021)Version 8.0.10 vom 26. August 2021
Typisierungdynamisch und optional statisch
Paradigmenimperativ
prozedural
objektorientiert
funktional
aspektorientiert
ProsCons
leicht zu erlernenlangsamer als kompilierte Sprachen und keine nativen Threads
sehr flexibelmächtige Konfigurationsdatei im Dateisystem
hohe Verbreitung, riesige Communityhistorisch gewachsen, viele Inkonsistenzen und fragwürdige Design-Entscheidungen
riesiges Ökosystemviele Breaking Changes
umfangreiche Dokumentationinkonsistente Ausnahmebehandlung
Garbage Collector und REPL

virtuallet

virtuallet ist ein kleines Programm von mir, welches ich in diversen Programmiersprachen implementiert habe. Hier geht es direkt zum Groovy-Code von virtuallet auf GitLab. Hier gibt es weitere Infos zu virtuallet.

- Geschichte von PHP von Rasmus Lerdorf
- Dokumentation der php.ini
- Fehlerbehandlung in PHP mittels set_error_handler
- Blogbeitrag über Inkonsistenzen und schlechte Design-Entscheidungen in PHP