Foreach-Else
Wahrscheinlich habt ihr heute alle frei? Ich meine, William und Kate heiraten ja und da sollte man vorm TV sitzen. Oder auch nicht, ich zumindest habe frei (aber aus anderen Gründen). Nichtsdestotrotz will ich trotzdem versuchen was zu Papier zu bringen und wie jeden Freitag was veröffentlichen. Zwar nur was kurzes, aber für `nen Nils-hat-Urlaub-Tag ist das ja OK.
Wer von euch kennt Twig? Niemand? Jeder? Naja auf jeden Fall ist es die Templateengine, auf die Symfony2 baut. Jetzt mag man ja geteilter Meinung sein, was Templateengines angeht, aber Twig hat ein paar schöne Eigenschaften, von denen ich heute ein Sprachkonstrukt rausgreifen möchte.
Es geht um das Foreach-Else-Konstrukt. Klingt erstmal komisch, der eine Teil ist eine Schleife und der zweite eine konditionelle Bedingung, wenn man es sich aber mal genaue anschaut, dann macht es vielleicht doch Sinn. Nehmen wir ein Beispiel:
foreach( $values as $value) {
echo $value;
}else{
echo „no values found“;
}
Was passiert hier? Das Konstrukt geht in die foreach rein, sobald da ein sinnvoller Wert in $values drinnen ist, ansonsten macht er halt den else-Fall. Ist auf jeden Fall eine schöne Abkürzung.
Notwendig ist das ganze natürlich nicht, ich kann jetzt mit der Sprache nicht mehr machen, als zuvor, aber hilfreich kann es sein und je kürzer der Code ist, desto besser kann man ihn auch lesen.
Der Vollständigkeit halber: Das kann smarty auch:
http://www.smarty.net/docsv2/de/language.function.foreach
William und Kate? Sind das Gewinner aus einer Casting-Show? Muss man nicht kennen, oder?
Egal, foreach-else ist netter syntaktischer Zucker. Auf jeden Fall besser als immer zu schreiben:
if (count($values)>0){
foreach($values as $value){
$something->uses($value);}}
else{
$something->withoutValues();}
🙂
Ich habe den Beitrag vorhin nur kurz überflogen, bevor ich aus dem Haus musste und habe mich schon über ein mir bislang unbekanntes PHP-Feature gefreut…
Ist schon sehr nett, aber Engines wie Smarty bieten einige derartig Konstrukte.
Und ich hab mich schon gefreut, hier jetzt was offtopic über das schöne Paar zu lesen. 😉 Find’s aber sehr fleißig, dass du dich auch an einem Urlaubstag hinter dein Blog klemmst.
Liebe Grüße, Tanja
Nettes Feature, aber gerade in „Templates“ habe ich fast immer den Fall, dass beim Fall, in dem foreach greift, noch mehr zu tun ist als bloß die Schleife durchzulaufen, z.B:
if (count($values) {
echo “;
foreach ($values as $value ) { echo “.$value.“;}
echo “;
} else {
echo ’nix da‘;
}
Da würde foreach-else auch nix bringen
Schaut auch elegant aus:
$vars=array();
foreach($vars as $var)
;
if (!$vars)
echo „empty“;
Viel Spaß bei der Hochzeit^^
Twig ist zu unrecht immer noch ziemlich unbekannt. foreach-else ist auch eines meiner Lieblingsfeatures.
Super Sache.
Hätte ich gerne als Standard-PHP-Konstrukt.
Letztlich sehe ich mich auch häufig derartiges:
if () {
foreach () {
}
} else {
}
schreiben. Und das foreach-else-Konstrukt ist einfach nur elegant und wesentlich besser zu lesen.
Wo kann man dafür voten, dass es in PHP aufgenommen wird?
@Thomas: Anscheinend hat die Kommentarfunktion deine Tags gefressen (ich sehe keine). Aber du hast Recht, das Problem kenne ich auch und es tritt gerade bei Template-Engines sofort in Form von Listen auf – HTML erfordert nunmal, dass die Listenpunkten-Elemente in einem größeren Element eingeschlossen sind. Damit ist for-each-else keine Option mehr.
Eigentlich schon bekloppt, dass PHP dieses Feature nicht bietet, aber Template-Engines, wo man es gar nicht so häufig gebrauchen kann, schon.
Okay, aber das man Guards vor Schleifen und andere Konstrukte setzen kann ist jetzt eigentlich nicht unbedingt neu.
if ($values) // Code-Guard
foreach($values as $value) {
echo $value;
} else {
echo „no values found“;
}
Na also: geht doch! 100% valider PHP-Code.
Ich würde mir wünschen, dass man zusätzlich das Error-Reporting für foreach() steuern könnte. Z.B.:
foreach ($values as $val, E_PARSE) {
…echo … ;
} else {
…echo … ;
};
Ist ja alles schick und nett. Aber auch sinnvoll? Schließlich wandelt jede Template Engine derlei Code in ausführbaren PHP-Code um. Unterm Strich kommt also das Gleiche bei raus, als würde man es direkt in PHP schreiben. Im Falles der Template Engine kommt dann aber noch der Performance Overhead für’s Parsen und Konvertieren dazu. Und das alles nur, um es einfacher und kürzer zu haben? Hmmmm …
Das Parsen kannst du vermutlich vernachlässigen, wird sicherlich in PHP-Code gewandelt und dann einfach daraus gelesen, ist also genauso schnell wie dein Code (außer beim ersten Zugriff)
René, bitte nicht wieder das Faß aufmachen, warum TE grundlegend gut oder schlecht sind. Sie erfüllen halt andere Zwecke als reiner PHP Code. Und Twig löst einige Standardaufgaben recht elegant.
Ich war mir nicht sicher, aber es ist mir direkt ins Auge gesprungen. Erst habe ich überlegt, was ist denn eine „konditionelle Bedingung“ ?
Einfach weil ich das von „Kondition“ abgeleitet habe, machte das für mich irgendwie überhaupt keinen Sinn.
Aber ich vermute es ist einfach ein Tippfehler, weil ich dann auf das hier gestossen bin:
http://www.postgresql.org/files/documentation/books/pghandbuch/html/functions-conditional.html
Erklärs mir bitte wenn ich falsch liege. Danke.
Marco
Ich will nun keinen Streit auslösen, aber natürlich sind Template-Engines in PHP völliger Unsinn. Außerdem ist Emacs besser als Vim, Tabs besser als Spaces, Unix besser als Windows und BSD besser als Linux. *troll*
Neee, Template-Engines sind eigentlich eine gute Sache. Problematisch sehe ich aber, dass oft mehr und mehr Features eingebaut werden, die den Autoren erlauben, mehr und mehr Logik in die Templates zu bauen.
@nik: Das Faß geöffnet wurde ja schon mit dem Artikel selbst. Und nen Streit vom Zaun brechen will ich auch nicht. Im Gegenteil, ich bin für eine Template Engine. Und zwar für die beste, die es für PHP gibt. Um es mit den Worten von Rasmus Lerdorf zu sagen: PHP ist die besten Template Engine für PHP. Darum gibt es u.a. die Dateiendung .phtml. Man muss sich eben nur diszipliniere, wie bei anderen Engines auch. Hat dann aber keinerlei Performance Overhead.
@Timo: Ganz Deiner Meinung. Ich habe noch kein Projekt erlebt, in welchem die Verwendung von Template Engines NICHT zu Logik-Chaos in den Views / Templates führte. Die Engines werden immer umfangreicher und bieten immer mehr Features, nur um im Endeffekt wieder das machen zu können, was PHP selbst schon kann.
Dieses einfache Beispiel mit PHP sollte auch funktionieren: 😉
if(!empty($values))
foreach($values as $value) {
} else {
}
Wir drehen uns im Kreis. „..sollte auch funktionieren..“:
> Notwendig ist das ganze natürlich nicht, ich kann jetzt mit der Sprache nicht mehr machen, als zuvor, aber hilfreich kann es sein und je kürzer der Code ist, desto besser kann man ihn auch lesen.
@nik: thx.
Es ist eben syntaktischer Zucker http://de.wikipedia.org/wiki/Syntaktischer_Zucker.