Warum hassen so viele PHP?

9 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Zunächst einmal kann ich nicht verstehen, wieso diese Frage mit merkel, Religion und Coronavirus getaggt wurde, da sie doch überhaupt nichts damit zutun hat.

Um auf deine Frage einzugehen, sollte man sich zumindest grob mit der Historie von PHP befassen und dem damit verbundenen Sprachdesign.

Die Sprache startete als auf das prozedurale Paradigma ausgelegter Baukasten und mit PHP 4 kamen dann erste Features der objektorientierten Programmierung hinzu. Wobei dieses Modell ziemlich schwach ausgebaut war. Mehrere Interfaces konnten bspw. nicht für eine Klasse implementiert werden und Methoden waren auch ohne Objektinstanz von überall aus aufrufbar. Da es keine access modifiers gab, hat man sich mit Konventionen beholfen (zwei Unterstriche vor private Member). Soweit hat man mit PHP 5 doch ziemlich nachgebessert. Eine Abwärtskompatibilität gab es aber nicht.

All diese Umbauten an der Sprache sorgten für neue Probleme, welche erst nach und nach behoben werden konnten. Nach wie vor gibt es (zumindest in der 5er-Version) Probleme mit Zeichenkodierungen (explizit UTF-8). So ist bspw. die DOMDocument-Klasse unbrauchbar, wenn man nicht mit Workarounds nachbessert (lies hier). Der daraufhin folgende Versuch, eine Version 6 zu entwickeln, scheiterte völlig und wurde daher schließlich übersprungen. Es hat also ziemlich lange gebraucht, bis PHP 7 endlich entwickelt wurde. Wieder mit teilweise fehlender Abwärtskompatibilität.

Soweit wie gesagt, erst einmal ein grober Abriss. Nun wurden während diesen Entwicklungen einige seltsame, wohl nicht gut durchdachte Designentscheidungen getroffen.

PHP fehlt es an ziemlich vielen Stellen an Konsistenz.

Ein paar Beispiele:

1) Manchmal agiert PHP case sensitive, manchmal wiederum nicht.

Konkret kannst du Keywords und Funktionsnamen in Groß- oder Kleinbuchstaben schreiben, PHP wertet sie als gleich.

function saySomething() {
  print "Hello";
}

SAYSOMETHING();

Bei Variablen wiederum ist es nicht so.

$a = 1;
print $A;

2) PHP ist eine Sprache, die ihre konkreten Typen eigentlich implizit handhabt. Dennoch hat sie Typecast-Operatoren wie int, float oder unset (ergibt immer NULL, auch bei Primitiven).

3) Das beste Beispiel sind die Funktionsbezeichner in PHP.

  • Manchmal orientieren sie sich an der ungarischen Notation (strchr), dann wieder nicht (parse_str), obwohl es sich in beiden Fällen um String-Funktionen handelt.
  • Manche Bezeichner verwenden den snake_stil (z.B. chunk_split), manche wiederum nicht (z.B. addcslashes).
  • Manche Bezeichner starten mit einem Verb gefolgt von einem Substantiv (z.B. gethostname), andere wiederum machen es andersherum (z.B. array_merge).

Die Bezeichner sind somit nicht intuitiv.

Das nächste Problem: Manches Verhalten ist nicht immer intuitiv erwartbar.

Ein paar Beispiele:

1) Versuche einmal, true und false auszugeben:

print true;
print false;

Für erstere Anweisung wird noch die 1 ausgegeben. Für die zweite Ausgabe nichts. PHP evaluiert hier true und false intern zu den Zahlenwerten 1 und 0 und wandelt diese implizit in Strings um. Ein falscher Wert wird dabei allerdings zu einer leeren Zeichenkette.

Versuchen wir das aber stattdessen explizit mit der 0:

print 0;

wird auch eine 0 ausgegeben.

2) Wenn man den einfachen Gleichheitsoperator verwendet, muss man aufpassen:

print "test" == 0; // 1
print "test" == true; // 1
print true == 0; // ""

3) Einmal angenommen, es gibt in deinem Programm einen Integer und der läuft einmal aus seinen Wertebereich hinaus. Er wird sich nicht wie andere Programmiersprachen verhalten, die vielleicht wieder am Anfang des Wertebereichs beginnen oder einen Fehler werfen. Stattdessen wird der Wert von da an einfach als float behandelt.

Es gibt noch viele andere konkrete Punkte, die man wohl benennen könnte. Verschieden Internetartikel beschäftigen sich damit bereits detaillierter:

Da ich im letzten Punkt die Dokumentation erwähnt habe: Diese wird öfter negativ betrachtet, denn sie ist an einigen Stellen unpräzise und manchmal machen erst die Nutzerkommentare am Ende der Artikelseiten auf diverse Feinheiten / Spezialfälle aufmerksam. Dennoch bin ich der Ansicht, dass man die Dokumentation stets als erste Online-Referenzseite wählen sollte. Einige Fehler wurden, so macht es für mich den Anschein, zudem bereits behoben.

Zu einem letzten großen Kritikpunkt von PHP möchte abschließend noch kommen: Zum einen ist die Sprache sehr einfach zu erlernen (das war ja auch ihr Ziel) und zum anderen unterstützt sie aber auch einen ziemlich schlechten Code-Stil. Funktionen können bspw. unterschiedliche Rückgabetypen haben, Variablen werden von dem Moment an, in dem man sie schreibt, global für den notwendigen Bereich angelegt und für mehrere Elemente gibt es Duplikate/Aliase (z.B.: die für exit, bool für boolean, is_integer für is_int, and für &&). Wenn man geschweifte Klammern nicht mag, kann man eine alternative Syntax für Kontrollstrukturen wählen. Dies alles bläht die Sprache auf und man nähert sich Perl an, die gerade für diese Eigenschaft (There's more than one way to do it) eher negativ bekannt ist (oder: Es ist zumindest ein zweischneidiges Schwert).

Dieser generelle Umstand hat es vielen Anfängern leicht gemacht, in die Webentwicklung einzusteigen (soweit kein Problem), ihre bis dahin gelernten Fertigkeiten zu verkaufen und dabei Software zu entwickeln, die leider als grauenhaft einzustufen ist. Durch die gering ausfallende Entwicklungszeit und geringe Kosten kam das bei Kunden natürlich gut an. Nur Folgeentwickler hatten oft noch daran zu knabbern, denn die Fehlersuche gestaltete sich nicht so leicht. Der Marktpreis für die Webentwicklung wurde z.T. gedrückt, die Code-Basis durfte (aufgrund zu hohen Aufwands) nicht umgeschrieben werden und das Monstrum konnte ungehindert weiterwachsen. Ich denke, da ist es verständlich, dass einige Entwickler nicht gut auf PHP zu sprechen sind.

Im letzten Abschnitt möchte ich mir aber auch noch Worte der Gegenrede zum obigen Teil nehmen. So wie Java noch immer mit dem Vorurteil zu kämpfen hat, deren Ausführung sei langsam, so ist es bei PHP ein Vorurteil, wenn jemand behauptet, man könne mit der Sprache keine vernünftige Software entwickeln. Gerade die neuen Frameworks (Symfony, Laravel, ...) beweisen das Gegenteil. Es gibt Code Concepts für sauberen Code. Wenn man sich mit solchen Guides beschäftigt, kann es auch etwas Gutes werden. Dies gilt zudem auch für andere Sprachen, denn auch mit Java oder Python kann man grässlichen Code entwickeln (sie steuern wohl nur etwas mehr dagegen).

PHP konkret zu hassen oder als Dreck zu bezeichnen, halte ich für Unsinn. Es geht somit schon etwas zu sehr der Ringparabel entgegen. Die Sprache hat Fallstricke und Unschönheiten, doch sie erfüllt auch ihren Zweck: Schnelle und einfache Webentwicklung. Zudem ist seit Version 7 wieder etwas mehr spürbare Entwicklung in der Sprache, als es die zehn Jahre zuvor der Fall war.


Palladin007  10.05.2020, 15:33

Schön geschrieben.

Ich bin auch kein PHP-Experte, ich hab nach meiner Ausbildung nochmal was mit PHP versucht, aber ziemlich schnell wieder aufgegeben :D
Liegt vermutlich daran, dass ich C# als meine "Main-Sprache" und eine doch recht konsistente Arbeitsweise und absolut zuverlässige Doku gewohnt bin.

Eine Frage habe ich aber:

print "test" == 0; // 1
print "test" == true; // 1
print true == 0; // ""

Zeile 2: String mit sichtbaren Zeichen wird bei Bool-Vergleich als true interpretiert und true == true ergibt true und true wird als 1 ausgegeben.
Zeile 3: true wird beim Int-Vergleich als 1 interpretiert, 1 == 0 ergibt false und false wird als Leerstring ausgegeben.

Soweit klar, aber was für einen Sinn macht Zeile 1?
Wie ich es auch drehe und wende, ich komme nicht auf 1 bzw. true, wann würde ein Nicht-Leerstring == 0 denn true ergeben?

0
regex9  10.05.2020, 15:42
@Palladin007

PHP versucht implizit, den String in eine Zahl umzuwandeln. Da das mit test nicht so richtig klappt, wird der Wert zu 0 konvertiert und das ist gleich der 0 auf der gegenüberliegenden Seite. Noch präziser wird es hier in der Dokumentation geschildert.

0
Schnurren  27.06.2021, 01:37

2) Dafür gibt es ja den ===, welcher auch den Datentyp überprüft.

0
regex9  27.06.2021, 02:28
@Schnurren

Ich schrieb nicht umsonst: Wenn man den einfachen Gleichheitsoperator verwendet (...). Punkt 2 soll konkret das Verhalten diesen Operators beschreiben, egal welche anderen Operatoren es noch gibt.

1
Aber ich nutze PHP nicht, habe keine Lust, mich mit PHP-Code auseinanderzusetzen und würde jedem davon abraten, es zu lernen.

Das ist doch wohl die unsinnigste Begründung, nur weil Du keine Ahnung von PHP hast willst du davon abraten?

Wie machst du denn die SQL Abbildung ?

Wie machst du Login-Seiten?

Wie machst du Formular-Abfragen?

Wie machst du dynamische schnelle Seiten?

Perl?

Perl ist doch noch viel komplizierter

JS?

Das ist doch keine echte Alternative sondern nur ein Krückstock - und JS-Dateien bzw direkt im HTML sind einfach von jedem einsehbar und damit nicht nur aus Performance und SEO Sicht ungünstig sondern auch ein Sicherheitsrisiko.

Also wie kommst du zu deiner Warnung vor PHP?


regex9  10.05.2020, 14:54

Du hättest deine Antwort als Kommentar unter der Antwort von Palladin007 schreiben sollen, denn an ihn war doch diese Gegenrede gerichtet. 😉

Ich denke allerdings, dass ich für ihn deine ersten Fragen beantworten kann. Das Perl für ihn keine Alternative ist, liegt auf der Hand, wenn man seine Antwort liest. C# wäre es allerdings.

0
NackterGerd  10.05.2020, 16:07
@regex9

Da hat mir mein Handy wohl ein Streich gepielt - keine Ahnung warum die Antwort hier erscheint

Aber o.k.

Zu C# das kenne ich zu wenig - läuft das auch auf dem Server ?

0
regex9  10.05.2020, 16:23
@NackterGerd

Ja, C# kann auch auf einem Webserver ausgeführt werden.

0

Natürlich kann man auch mit PHP arbeiten, und jede Sprache hat ihre Vor- und Nachteile.

Aber PHP hat in der Summe und auf den Sprachumfang bezogen viel mehr Probleme, als (so ziemlich) alle anderen Sprachen.

Die hauptsächlichen Gründe sind m.. M. n.:

  • die total inkonsistente Namensgebung von Bezeichnern (v. a. Funktionen und Konstanten)
  • die überaus schlechte Dokumentation (die bei jeder zweiten Funktion wichtige Dinge verschweigt oder falsch wieder gibt und ohne die Nutzerkommentare am Ende kaum brauchbar wäre)
  • das schlechte Sprachdesign (wirre Reihenfolge von Funktionsparametern, mal von links, und mal von rechts, oder die Inkompatibilität von Schwesterfunktionen)
  • Der in C geschriebene PHP-Interpreter ist eine Katastrophe und strotzt nur so vor Codesmells und DoNots (zumindest im Vergleich zu Python & Co)
  • Das Chaos bei Drittanbieter-Modulen von PHP ist eine Katasttrophe. Die Dokumentation zu OpenSSL, SQLite und den IPC-Primitiven ist faktisch nicht zu gebrauchen, da teilweise einfach leer. (Da sind also nicht mal Platzhalter vorhanden, und man muss sich a) entweder den Quelltext ansehen, oder b) die Doku des Drittprojekts zu Rate ziehen, und hoffen, dass das genau so in PHP übernommen wurde, was sehr oft leider überhaupt nicht der Fall ist)
  • Unicode-Unterstützung gibt es nur als Knickei und nur halbgar serviert. Will man Unicode-Strings in einer DB abspeichern, gibt es mindestens 5 Stellen, an denen man die Kodierung prüfen muss, damit es nicht zu Mojibake kommt.

Also das wären so die Punkte, die mir an PHP nicht gefallen und die einzeln zwar auch bei anderen Sprachen vorkommen, aber bei keiner mir bekannten Mainstreamsprache in dieser Häufung und Konzentration.

Aber wie gesagt, natürlich kann man mit PHP arbeiten und interessante Sachen entwickeln.

Also PHP ist jetzt nicht völlig unbenutzbar, aber in vielen Bereichen nahe dran. Da hat man dann einfach keine Wahl, als ein Modul in einer Fremdsprache zu schreiben ... was die ganze Sache dann noch frickeliger macht. :)

PHP hat sich zwar seit 7.x gemacht, aber ist in den oben genannten Punkten noch weit von anderen Sprachen entfernt.

Und dass du als Einsteiger, der kaum etwas anderes als PHP kennt, eben genau diese Sprache toll findest, ist kein Wunder. Wenn du erst mal mit wirklich mehr als einer Hand voll anderer Sprachen gearbeitet hast, wirst du das ähnlich sehen, wie ich .... vermutlich. :)

Woher ich das weiß:Berufserfahrung

Gegenüber PHP kenne ich noch Perl, das bediengt denke ich das selbe Gebiet. Perl finde ich schlimmer als PHP. Hier kann's aber auch sein, dass ich vorbelastet bin, ich hab ein halbes Jahr mit einem katastrophalen Onlineshop gerarbeitet, der in Perl entwickelt wurde.

Ich mag PHP nicht, weil es insgesamt, also die Sprach-Features und auch die vielen Frameworks, das absolute Gegenteil von Konsistenz sind. Außerdem mag ich keine schwach typisierten Sprachen, ich mag lieber streng typisierte Sprachen. Und ich mag OOP, das wirkt bei PHP aber eher wie "angeklebt".
Das Ergebnis ist, dass sich für mich die Arbeit mit PHP wie Gefrickel anfühlt.

"Hass" in dem Sinne finde ich aber auch unbegründet. Hass allgemein finde ich unbegründet, völlig egal, bei welchem Thema.
Aber ich nutze PHP nicht, habe keine Lust, mich mit PHP-Code auseinanderzusetzen und würde jedem davon abraten, es zu lernen.


Von PHP, Perl und Python mag ich PHP am liebsten.

Viele Kollegen ziehen Python vor und andere im Buildmanagement verwenden Perl.

Kommt wohl drauf an, wie eine Skriptsprache in andere Umgebungen am besten eingebettet werden können.