PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

PHP hasst mich

;) Okay, kleines Wortspiel. Nils verzeiht mir hoffentlich, dass ich seinen Blog-Namen missbrauche. Aber eigentlich bin ich ganz im Sinn der Sache unterwegs. Gerade wurde mir ein Bug reported, von dem ich dachte “Sowas gibts doch gar nicht!”. Oh doch, gibt es.

Es handelt sich um die PHP-Funktion “ucwords“: Die soll (eigentlich) in einzelnen Worten in einem String den Anfangsbuchstaben in Grossbuchstaben und alle restlichen Buchstaben in Kleinbuchstaben umwandeln. Funktioniert prima, so lange es sich um einen String in Kleinbuchstaben handelt. Wer einen String mit Grossbuchstaben übergibt, wird enttäuscht: Nix passiert.

Das gleiche übrigens bei “ucfirst“. Dieses Verhalten ist zwar in einem Beispiel dokumentiert, aber nicht begründet. Wer macht so eine Scheisse bitte? Selbst wenn es einen Grund gibt, solche impliziten Verhaltensweisen zu implementieren, sollten Sie aus dem Namen der Funktion hervorgehen oder mit einem Flag deaktivierbar sein.

Also nur so als Tipp: Wenn eine Funktion etwas macht, was nicht direkt aus ihrem Namen hervorgeht, sollte

  • entweder die Funktion umbenannt werden,
  • um ein Flag zum Deaktivieren erweitert werden,
  • oder am Besten: so umgebaut werden, das sie das tut, was man von ihr erwartet…

Achso: Mit Unit-Tests wäre das nicht passiert ;)

Ähnliche Artikel:

  1. Aufwärtkompatibel zu PHP 6

Hannes Christiansen meint dazu:

2. März 2009 um 14:54

Zum Glück muss nicht alles einen Sinn haben :D
Aber ich stimme deinen Tipps zu. Auch wenn es bei der Funktion nicht besonders schwer ist, strtolower() zu benutzen.

freedimension meint dazu:

2. März 2009 um 14:55

“und alle restlichen Buchstaben in Kleinbuchstaben umwandeln.”
Woher hast du das? Selbst hinein interpretiert? php.net sagt da nämlich definitiv etwas anderes:
“Returns a string with the first character of each word in str capitalized, if that character is alphabetic.”
Da steht also nun wirklich nichts von “in Kleinbuchstaben umwandeln” ;-)

Sven meint dazu:

2. März 2009 um 15:09

Danke für die Info. Das Verhalten ist mir noch nicht in die Quere gekommen. Aber gut zu wissen für die Zukunft.

timi meint dazu:

2. März 2009 um 15:14

Hehe :) Trotzdem hat freedimension Recht… Laut manual lässt die Funktion ausserdem ersten Buchstaben alle anderen aussen vor. Unter diesem Gesichtspunkt ist es natürlich logisch, das der Result unverändert ist, wenn alles ohnehin schon in Grossbuchstaben übergeben wird.

Trotzdem mag man sich über denn Sinn der Funktion streiten, denn was nützt es, wenn nur der 1. Buchstabe umgewandelt wird?

Ben meint dazu:

2. März 2009 um 15:15

Das verhalten ist total verständlich, so werden Akronyme nicht einfach zu Kleinbuchstaben umgewandelt.

Ben meint dazu:

2. März 2009 um 15:16

@timi: Für englische Überschriften macht man halt jeden ersten Buchstaben groß, CamelCase und Akronyme sollten dabei aber unverändert bleiben.

timi meint dazu:

2. März 2009 um 15:18

Klar Ben, da gebe ich Dir natürlich Recht…

butzi meint dazu:

4. März 2009 um 10:00

Ich denk auch, dass es eher nen Anwenderfehler ist, bzw. du da was falsch interpretiert hast.
Von den Funktionen wird immerhin verlangt, dass sie sehr schnell sind und somit ist die Wandlung des gesamten Strings nicht ganz sinnvoll.
ucfirst und ucwords enthalten aus meiner sicht auch keinen Hinweis, dass da irgendwas klein geschrieben oder verändert wird.

Sorry, aber da ist PHP wohl im Recht :-)

Alexander meint dazu:

4. März 2009 um 17:38

Wie heißt es so schön, der PC ist nur so gut wie sein Nutzer. Also nicht einfach auf die Kiste schieben oder auf das Programm, sondern einfach mal den Fehler an einem selbst suchen. Ich wenn mich dann bei so einer Sache eine halbe Stunde fern halte von meiner Kiste, dann geht das schon wieder und dann kann ich den Fehler meistens auch sehr schnell finden und beheben. Da muss man dann nicht erst am Programm rumdoktorn ;-) Versuchs mal vielleicht klappts beim nächsten Mal.

timi meint dazu:

4. März 2009 um 17:46

*lach* Jaja Jungs :) Is ok, schon kapiert…

Nils meint dazu:

6. März 2009 um 13:15

Haltet den Dieb!!!
Keine Sorge, Wortspiel ist verziehen.

Bullterrier meint dazu:

8. März 2009 um 20:00

Warte, der Satz gehört MIR!!!
Wobei, ich werde ihn noch ein wenig umformulieren (Achtung Raub!!):
PHP hasst mich :( und ich hasse PHP!!!
Naja, nicht ganz so richtig, aber manchmal treibt es mich in den Wahnsinn ;-)

timi meint dazu:

13. März 2009 um 14:47

hehe :) Nur nicht streiten…

Tobias meint dazu:

31. März 2009 um 17:37

Aber über und mit PHP lässt es sich eben vortrefflich streiben :-)

Handyzubehör meint dazu:

8. April 2009 um 18:57

Nützliche post. Danke!

Estero meint dazu:

21. April 2009 um 10:08

wieso “hassen”? - komisch klingt das alles, aber mal sehen! muss immer ueberlegen…

Jügen meint dazu:

5. August 2009 um 14:43

Cool, wusste ich auch noch nicht. Aber für diesen Fall (Nur Großbchstaben) verwenden sie vermutlich auch die wenigsten. Jedoch gut zu wissen ;)

Hannes meint dazu:

23. September 2009 um 14:30

Die Funktion arbeitet absolut richtig. Sich darüber aufzuregen, dass man selbst etwas falsch interpretiert hat, halte ich für unangemessen und unreif.

Gruss

Manuel Grundner meint dazu:

12. Januar 2010 um 17:40

Die Funktion ist eigentlich fast völlig korrekt implementiert und zeigt das gewünschte Verhalten. Nur der Name sollte uppercaseFirst heißen. Noch besser uppercaseFirstChar(ecter).
ucFirst macht genau das was sein Funktionsname beschreibt, den ersten Buchstaben groß zu schreiben.
Bei CamelCase ist das sehr nützlich (Factories).
Wenns anders wäre, wäre der ganze CamelCase im A**** das wäre dann ein WTF.

lg Manuel

Dennis meint dazu:

26. Mai 2010 um 13:39

PHP hat schon ein paar komische Eigenarten. Einige Sachen kommen mir auch oft schlecht durchdacht vor.

Gerd meint dazu:

30. Juli 2010 um 16:16

PHP macht bei mir auch hin und wieder zicken , aber ehrlich geagt währe ich ohne aufgeschmissen.

Jan-Christoph Brier meint dazu:

25. Januar 2011 um 13:38

Ich persönlich finde die Funktionen sinnlos, denn ich wüsste nicht wo ich diese verwenden sollte! Wenn ich Daten abfrage, welche ich in eine DB eingegeben habe, gebe ich diese so ein, wie ich diese ausgeben möchte:P

Peter meint dazu:

16. Juni 2011 um 14:20

Ich stimme Jan-Christoph zu, denn auch ich finde die Funktionen denkbar sinnlos.

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung