was ist das ? für ein operant

than

Mitglied
huhu,

kann mir jemand sagen was das ? in dem code bedeutet:
PHP:
$x=($x<= 0) ? $x=1 : $x;

soll es "oder" bedeuten? wenn ja, ist das 'normales' coden oder eine veraltete sache.
könnte man nicht auch "or" oder "||" benutzen?
 
Hi,

das ist eine Kurzform einer Bedingung:
PHP:
$x=($x<= 0) ? $x=1 : $x;
// entspricht:
if ($x <=0) {
    $x = 1;
}
$x wird also abhängig von der Bedingung (<=0) eine 1 zugewiesen, oder, andernfalls, $x (es passiert gar nichts).
Anderes Beispiel:
PHP:
($x >= 17) ? $bla = 2 : $bla += 2;
// entspräche:
if ($x >= 17) {
  $bla = 2;
} else {
  $bla += 2;
}

Gruß
.
 
Man nennt das ternärer Ausdruck.
Diese sind sehr umstritten.
Einige sagen, sie machen den Code schwer lesbar, andere halten sie für ein geeignetes Mittel, um den Code Dank der kurzen Schreibweise übersichtlich zu halten.
Insbesondere, wenn man mehrere ternäre Ausdrücke ineinander schachtelt, können sie schwerer lesbarer sein als verschachtelte if-Abfragen.
Ich persönliche liebe diese Art von Syntax und habe relativ wenig Probleme sie auch verschachtelt zu lesen. Da finde ich verschachtelte if-Abfragen nicht besser.
Besonders innerhalb eines echo können sie Arbeit ersparen.
Als Beispiel:
PHP:
echo "Zu dem Eintrag gibt es ".(($aenderung == 1)?"eine Änderung.":$aenderung." Änderungen.");
//ist das gleiche wie:
if ($aenderung==1) {
    echo "Zu dem Eintrag gibt es eine Änderung.";
} else {
    echo "Zu dem Eintrag gibt es ".$aenderung." Änderungen.";
}
Solltest Du dann zum Beispiel Deinen Text ändern wollen (z.B. in "Der Eintrag hat ..."), brauchst Du nur in einer Zeile ändern und vergisst nicht evtl. den else-Zweig.
Wenn man Sie nicht zu excessiv einsetzt sollte sich daran keiner stören.
 
danke für die interessante auskunft

@ hpvw
da du ja sagst du liebst diese art von abkürzung, könnte es dann auch sein das du so etwas auch machst ? / bevorzugst ?
PHP:
if($x > 1): 
$x2="Link 1";
else: 
$x2="Link 2"; 
endif;
diese schreibweise ist für mich ebenfalls neu, habe ich nur einmal im web gefunden.
 
Was eben im Sinne der Vereinfachung für den ternären Operator spricht, dass er eben für kleine Teile gut einsetzbar ist, aber er ist immer noch ein Operator und keine Anwesiung (wie es das if ist). Manche sagen auch er wäre performanter als ein if (zumindest in C), aber wirklich gemerkt habe ich davon nix.

@than: Bei 1Zeiler-Ifs sind { und } oder auch diese andere schreibweise für if-else Konstrukte sowieso unnütz ;)
 
Die Schreibweise kannte ich auch noch nicht. Habe erst gedacht, das ist doch gar kein PHP, aber siehe da, eine test.php geschrieben und kein Parse Error.
Dennoch würde ich dieses spezielle so schreiben:
PHP:
$x2 = ($x>1)?"Link 1":"Link 2";
Ansonsten verwende ich if-else Konstrukte immer mit geschweiften Klammer, mehrzeilig und eingerückt. Also keine Abkürzung durch weglassen von Klammern oder schreiben in einer Zeile.
Ansonsten werden if-Abfragen für mich unübersichtlich. Außerdem habe ich regelmäßig vergessen, die Klammern zu ergänzen, wenn ich im nachhinhein doch eine zweite Anweiseung einfüge. Bei solchen Fehlern habe ich schon Stunden mit Suchen verbracht und mir daher das grundsätzliche Klammern angewöhnt.

PS: Und immer schön einrücken, das hilft den Code wieder zu verstehen.
Leider habe ich noch kein PHP-Editor gefunden, der das so clever automatisch macht, wie Eclipse für Java, auch das PHP-PlugIn für Eclipse nicht.
 
hpvw hat gesagt.:
PHP:
echo "Zu dem Eintrag gibt es ".(($aenderung == 1)?"eine Änderung.":$aenderung." Änderungen.");
//ist das gleiche wie:
if ($aenderung==1) {
    echo "Zu dem Eintrag gibt es eine Änderung.";
} else {
    echo "Zu dem Eintrag gibt es ".$aenderung." Änderungen.";
}
Solltest Du dann zum Beispiel Deinen Text ändern wollen (z.B. in "Der Eintrag hat ..."), brauchst Du nur in einer Zeile ändern und vergisst nicht evtl. den else-Zweig.
Der Fairheit halber kann man das von dir angesprochene Problem natürlich auch mit einer If-Abfrage umgehen:
PHP:
echo 'Zu dem Eintrag gibt es ';
if ($aenderung == 1) {
    echo 'eine Änderung.';
} else {
    echo $aenderung.' Änderungen.';
}
Wollte das nur noch einwerfen, weil mich der Vergleich in der Form gestört hat ;) Ich selber verwende den ternären Operator ab und an, sofern er mir mehr Nutzen (sinnvolle Verkürzung des Codes) als Schaden (Unübersichtlichkeit, schlechte Lesbarkeit) bringt.
 
Ich Benutze den ternären Operator gerne zur Überprüfung von Paramtern, z.B.:
PHP:
<?php
	[…]
	$param = ( isset($_REQUEST['param']) && (int)$_REQUEST['param'] > 0 )
		?	(int)$_REQUEST['param']
		:	FALSE;
	[…]
?>
 
Zurück