PHP? Bitte nicht!

Christian Fein

Erfahrenes Mitglied
Wird Zeit mal wieder eine *hoffentlich* grössere Diskussion in die Wege zu leiten.

Thema PHP und wie eine Sprache trotz massiver Fehler so häufig genutzt wird.

Auf die Gefahr hin das ich mich bei einigen unbeliebt mache, aber PHP ist hässlich inkonsistent, verleitet zu schlechter Programmierung und ist den Konkurrenzsprachen technisch sowie konzeptionell komplett unterlegen.

Da ich nicht einfach so ein Schmähsatz im Raum stehen lassen will, werd ich das mit Beispielen untermauern:

a) PHP ist hässlich:
Darauf gehe ich im Bezug von Inkonsistenz ein.

b) PHP ist inkonsitent:
case sensitiv - case insenstiv
ereg_replace - eregi_replace
str_replace - str_ireplace
strpos - stripos
strcmp - strcasecmp

Allein für die Unterscheidung zwischen Case Sensitiv und Case Insensitiv haben wir 4!! verschiedene Bennenungsvarianten.
str_ireplace <- i anfang 2. wortes
eregi_replace <- ende des 1. wortes
stripos <- irgendwoe dazwischen ein i
strcasecmp <- ein case in den funktionsnamen gemauschelt.

2 Funktionen:
strip_tags
stripcslashes

Wieso einmal mit underscore und einmal ohne? wieso nicht strip_tags und strip_clashes?
oder striptags und stripcslashes? Das zieht sich durch die komplette PHP Funktionsbenennung.

bin2hex oder strtolower. Wieso nicht bintohex u. strtolower bzw bin2hex u. str2lower.

Es resultiert daraus das mann in keiner anderen Sprache die ich kennen gelernt habe, trotz erfahrung so oft in der Referenz nachschlagen muss. Auch dann wenn mann den Namen der Funktion und der Parameter noch im Kopf hat (vor langer Zeit mal genutzt). Alleinig aufgrund der inkonsistenz in der Benennung.

Aufgrund eines fehlenden Konzeptes der Sprache in der Benennung und dadurch das PHP die hässliche Art der Variablen deklaration $var von Perl erbt macht PHP Code zu einem sehr hässlichen Konstrukt. Hässlichkeit von Code hat jedoch auch technische Relevanz da es kryptisch und schwer lesbar wird.
PHP bietet die hässlichkeit von Perl ohne dessen Mächtigkeit zu erben.

c) verleitet zu schlechter Programmierung. Globale Variablen und ein halbherzige OOP unterstützung. Beispielsweise Ausnahmebehandlung. Die Ausnahmebehandlung sieht genauso aus wie bei Java
try {
// mach was böses
} catch(Exception $e) {
echo $e->getMessage(), "\n";
}
Schön! Aber anscheinend haben die PHP Entwickler kein Interresse daran das selber zu nutzen. Denn wieso wirf file() keine Exception wenn die Datei nicht gefunden wird?
Ein PHP Programmierer muss sich selber darum kümmern zu prüfen ob gefunden wird oder nicht, und eine Exception bei Bedarf werfen
Im übrigen wird die OOP Fähigkeit die bei PHP5 nicht mehr ganz so schlimm ist von den PHP Entwicklern komplett ausser acht gelassen. Die Standard lib von PHP umfasst 3000 Funktionen komplett im globalen Namensraum ohne auch nur den Hauch von OOP.

d) Technische Unzulänglichkeiten
Scriptsprachen haben den Vorteil einiges bieten zu können welches mit anderen Sprachen weniger leicht umzusetzen ist. Da währen Closures, Iteratoren, Generatoren, lambda Funktionen (nur eine fehleranfällige create_funktion String Kombination) und und und. PHP bietet vom Sprachumfang nicht mal annähernd die Dynamik die Python, Ruby Perl bieten.

e) Konzeptionelle Unzulänglichkeiten
Globaler Namensraum für alle Funktionen. Keine OOP Unterstützung in der Standardlib.
Keine Ausnahmebehandlung in der Standardlib. Inkonsistenten in der Funktionsbenennung. Keine ordentliche Datenbank Schnittstelle sondern für jede Datenbank komplett verschiedene Funktionen.

ociexecute - Oracle 8
db2_execute - DB2
pg_execute - postgresql
mysql_query -mysql
Nur db2 und postgreSQL ähneln sich bei der Ausführung von Prepared Statements. Da gibts aber dann db2_tables, wo es kein pg_tables gibt. usw und sofort. Ich könnte hier ganze Seiten füllen mit Unterschieden bei den Zugriffen auf nur jene Datenbanken.
Es gibt zwar Bestrebungen das langsam aber sicher anzugleichen, aber der momentane Status ist schlimm. Resultat ist, ein PHP Projekt mal eben von MySQL auf Oracle zu migrieren ist ein extremer aufwand.
 
"Thema PHP und wie eine Sprache trotz massiver Fehler so häufig genutzt wird."

Das errinnert mich an was:
Thema Windows und wie ein OS trotz massiver Fehler so häufig genutzt wird." :-)

Ich persönlich Programmiere leider viel zu wenig um mit diesen Fehlern wirklich Probleme zu haben, würde mich aber auf jeden Fall interessieren was unsere Coding- und PHP-Experten dazu zu sagen haben.

Greetz...
Sinac
 
Ich programmier ja bekanntlich ganz gern mit PHP. Aber zum Teil find ich diese Inkonsistenzen auch recht nervig.
Was auch sehr verwirrend ist ist wenn man ploetzlich eine Fehlermeldung auf hebraeisch oder ostsumerisch oder was weiss ich vor Augen hat. Hatte da irgendwann mal sowas, gibt's auch einen Thread zu. ;)

Die Attraktivitaet von PHP liegt sicher darin, dass es grundsaetzlich erstmal recht einfach zu lernen ist. Ich muss jedoch auch zustimmen, dass PHP zu unsauberer und auch zu unsicherer Programmierung verleitet wenn man sich nicht sowieso fuer das Thema Sicherheit interessiert oder gar in einer lustigen, rosa Bluemchenwelt lebt wo es keine boesen Menschen gibt.
 
Dennis Wronka hat gesagt.:
Die Attraktivitaet von PHP liegt sicher darin, dass es grundsaetzlich erstmal recht einfach zu lernen ist.

Aber das stimmt doch gar nicht.

PHP ist nicht einfacher als andere Sprachen. Gerade für Anfänger. Vergleiche mit Python

PHP:
for($i = 0; $i < 10; $i++) {
   echo $i;
}

$str = " dies ";
while($a < 20) {
    $k = doSomeThing();
   if($k) {
       $str .= "ein String mit $k";
   } 
   $a++;
}

Python:
for i in range(10):
    echo i

str = " dies "
while a < 20:
     k = doSomeThing()
     if k: 
        str+= " ein String mit %s " % k
     a+=1

Nur mal so ein paar Code Konstrukte. Ich sehe nicht wo PHP einfacher ist. Im Gegenteil ist PHP kryptischer (um einiges kryptischer) und verlangt Vorwissen wie das:
1 == True ist und 0 == False. Das Addition von Zahlen
$a += 3 aber "addition" von Strings $str .= "blub" erledigt wird.
Ruby ist ähnlich leicht lesbarer als PHP. Mann kann diese Sprachen genauso einfach erlernen.
Mit dem grossen Unterschied, bei Python bleibt die Lernkurve ähnlich flach/steil wie zu beginn. Bei PHP aber stösst mann umso weiter mann kommt auf jene unzulänglichkeiten und die Lernkurve steigt massiv an.
 
Anstatt hier rumzujammern (hey, nicht so gemeint ;)), bringt doch lieber vernünftige Alternativen. Fakt ist nunmal, dass immer noch die meisten Server PHP und MySQL als Standard mitbringen. Ich würd ja auch auf Ruby umsteigen, wenn ich einen Provider fände, der es unterstützt. Genau das Gleiche wie bei den Betriebssystemen: Wenn nicht jedes Spiel ausschliesslich (ok, mittlerweile nicht mehr ganz so schlimm) für Windows produziert würde, würden die Leute (vor allem die jungen ;)) vielleicht auch mal langsam anfangen, sich für die Alternativen zu interessieren/begeistern.

Ausserdem könnte man, zumindest was die zugegebenermassen sehr inkonsistente Funktionsbezeichnung angeht, ja ein kleines File machen, das die Funktionsnamen quasi konsistenzifiziert (äh? :confused:) und das dann jeweils zu Beginn über include oder require (hallo, Rekursion! ;)) einbinden.
 
Oh ja wow. Gleich einen Thread in dem ordentliche Entwickler gegen PHP-Hobby-Gärtner diskutieren UND dazu auch noch ein Windows vs Linux Flamewar. Strike. Eventuell sollten wir noch eine kleine Prise .NET vs Java drüberstreuen. Dann hätten wir's.

Ungeachtet dessen, bleiben wir beim Thema:
Ich muss hier Chris zustimmen. Dennoch habe ich eine kleine Entschuldigung für PHP: Dieses Etwas ist durch die Jahre einfach gewachsen und daher gibt's auch ein wenig Unklarheiten bezüglich der Namensgebung und anderen Dingen. Und um vorzubeugen: Dies ist ironisch gemeint.

Eine andere Frage:
Wie lange sucht ihr PHP-Schreiber eigentlich einen Fehler bis ihr ihn gefunden habt? Die Debug-Funktionalität (darf man das überhaupt so nennen) ist das absolut schlimmste, wenn man diverse IDEs von wirklichen Sprachen gewohnt ist (Visual Studio, Eclipse, etc.). Moment, da gibt's ja Zend. Wieviele haben das eigentlich im Einsatz?

Naja, weitere Punkte werd ich vielleicht später einwerfen :)

Ad SilentWarrior:
Ähm, bitte? Vielleicht dann noch ein Mapping-File für das Mapping-File damit PHP endlich ein wenig sauberer wird? Ich denke, das Problem liegt da ganz wo anders. Programmiersprachen, oder so Skripties sollten von Beginn an sauber sein.

Alternativen gibt es genug und wurden teilweise auch von Chris genannt. Provider: Findet man. Auch kein Thema.
 
Norbert Eder hat gesagt.:
Wie lange sucht ihr PHP-Schreiber eigentlich einen Fehler bis ihr ihn gefunden habt?
Ein paar seltene Fehler sind schon fies zu finden, aber ansonsten geht das, dank vollem Error-Reporting recht fix. Vor allem wenn man nicht gleich 200 Zeilen Code in den Edior taettowiert und erst dann testet laesst sich so ein Fehler ja recht gut eingrenzen.

Wie gesagt, die Diskussion Amiga 500 vs. C64 fehlt auch noch... ;)
 
und spätestens dann wenn man etwas weiterkommt bietet PHP einem kaum etwas.

Python:
>>> def month():
... 	arr= [["Januar","Februar"],0]
... 	def step():
... 		arr[1]+=1
... 	def out():
... 		print arr[0][arr[1]]
... 	return step, out
... 
>>> month_step, month_out = month()
>>> month_out()
Januar
>>> month_step()
>>> month_out()
Februar
>>>

Closures wie diese sind in PHP gar nicht möglich. Es ist zu erwarten das Stark typisierende Sprachen wie Java, C usw damit nicht klar kommen. Aber PHP?
Wieso bietet PHP mir das nicht? Ruby, Groovy, Python, Perl, Lisp usw bieten mir das.
Mann hat mit PHP also eine Scriptsprache die ähnlich dynamisch ist wie eine stark typisierende Sprache.
 
SilentWarrior hat gesagt.:
Anstatt hier rumzujammern (hey, nicht so gemeint ;)), bringt doch lieber vernünftige Alternativen. Fakt ist nunmal, dass immer noch die meisten Server PHP und MySQL als Standard mitbringen. Ich würd ja auch auf Ruby umsteigen, wenn ich einen Provider fände, der es unterstützt.

domainfactory mod_python 9.90 € im Monat. ;)
Zudem richten sich die Hosting Anbieter nach dem was von den Kunden gewünscht wird. Natürlich nicht was EIN einziger Kunde wünscht.
mod_python bietet einem genau das selbe Entwicklungsmodell wie mod_php nur mit dem unterschied das mann eine leistungsfähige Sprache hat.

Ausserdem könnte man, zumindest was die zugegebenermassen sehr inkonsistente Funktionsbezeichnung angeht, ja ein kleines File machen, das die Funktionsnamen quasi konsistenzifiziert (äh? :confused:) und das dann jeweils zu Beginn über include oder require (hallo, Rekursion! ;)) einbinden.
Bähh anderer Vorschlag, haut den PHP Entwicklern solange auf den Deckel bis die das endlich mal gebacken bringen. Oder wechselt gleich zu einer der alternativen.
 

Neue Beiträge

Zurück