1unitedpower: Problem bei eienr IF Abfrage (isset($a->name) ? if($a->name==1)'

Beitrag lesen

<td>'.(isset($a->name) ? if($a->name==1)'<img src="yes.png" alt="">' : '<img src="no.png" alt="">').'</td>

So macht man es sich selbst schwer.

<?php
$foo='<td>';
if ( ! empty($a['name']) && $a['name'] == 1 ) {
   $foo .= '<img src="yes.png" alt="Ja">'
} else {
   $foo .= '<img src="no.png" alt="Nein">' 
}
$foo .= '</td>';

… ist viel besser lesbar und ergo weniger fehlerträchtig.

Über Lesbarkeit kann man streiten, if-Statements haben sprechende Keywords, die die einzelnen Bestandteile identifzieren, Ternitäts-Opertoren sind dafür weniger verbose.

Fehlerträchtiger ist ganz objektiv betrachtet allerdings die if-Variante. Der elementare Unterschied ist ja, dass es sich beim Ternitäts-Operator um einen Ausdruck handelt und beim if-Konstrukt um ein Kommando. Ausdrücke nehmen Eingaben entgegen und produzieren daraus Werte. Bei der Wahl ihrer Eingaben sind Ausdrücke sehr restriktiv, dort sind wiederum nur Ausdrücke erlaubt, keine Kommandos. Im Beispiel des TOs hat ja gerade dieses Verhalten zu einem Syntaxfehler geführt. Das ist eine gute Sache, denn das frühtzeitge Aufspüren von Fehlern ist eine wichtige Waffe gegen Fehleranfälligkeit. Kommandos hingegn erzeugen keine Werte, sie nehmen Einfluss auf den Programmablauf, indem sie den Speicherzustand manipulieren. Das ist vermutlich die häufigste Ursache für Programmfehler überhaupt, und zwar von der richtig üblen Sorte, weil man diese Fehler im Allgemeinen erst zur Laufzeit aufspüren kann.

Ausdrücke haben ferner den Vorteil, dass man ihren Rückgabewerten Namen geben kann, das fördert Lesbarkeit und sorgt gleichzeitig für erhöhte Wiederverwendtbarkeit.

<?php
list($imgSrc, $imgAlt) = (isset($a->name) && $a->name === 1)
  ? ['yes.png', 'Ja']
  : ['no.png', 'Nein'];

$td = "<td><img src=\"$imgSrc\" alt=\"$imgAlt\"></td>";

Bzw. in eingebetteter Schreibweise:

<?php
list($imgSrc, $imgAlt) = (isset($a->name) && $a->name === 1)
  ? ['yes.png', 'Ja']
  : ['no.png', 'Nein'];
?>
...
<td><img src="<?= $imgSrc ?>" alt="<?= $imgAlt ?>"></td>

Gunnars Vorschlag ist ein Spezialfall eines if-Statements, das ohne interne Speichermanipulation auskommt, weil die then- und else-Blöcke implizit an einer String-Konkatenation teilnehmen. Dieses Konstrukt ist semantisch dem Ternitäts-Operator sehr viel ähnlicher als der hier zuerst vorgeschlagenen if-Variante. Der Unterschied zu meinem Vorschlag ist hauptsächlich der Zeitpunkt an dem die Logik stattfindet: Im weitesten Sinne wäre das bei Gunnar im View, bei mir im ViewModel. Darüber wiederum gibt es eine ganz eiegene hitzige Debatte.