Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
achwasweisich
Threadersteller
Dabei seit: 27.09.2007
Ort: Stuttgarter Raum
Alter: -
Geschlecht:
|
Verfasst Fr 07.12.2007 09:06
Titel PHP zu doof? |
|
|
Moin,
ich habe folgendes Konstrukt oft und gern in Perl benutzt.
Aber scheinbar versteht PHP nicht, was ich will und liefert
immer das Ergebnis
Hier das Konstrukt:
Code: | $x = 3;
$a = $x==1 ? 1 : $x==2 ? 2 : $x==3 ? 3 : $x==4 ? 4 : 0;
print $a; |
Hat mir jemand eine Erklärung für das seltsame Verhalten von
PHP?
Irgendwie scheint es so, als würde Perl die weitere Prüfung abbrechen,
wenn es den Punkt erreicht hat. PHP scheint
aber irgendwie "von rechts" zu evaluieren und nimmt daher
Code: | ($x==3) ? (3 : $x==4 ?) => 4 : 0; |
Es "guckt" also quasi nach dem ":", der ganz am Ende des statements
steht und wertet das links davon stehende als Ergebnis aus.
Ach ja: ich weiß durchaus, daß man das na klar sehr elegant
mit einem switch-case lösen kann. Es geht ja nicht darum,
wie ich es umgehen kann, sondern warum PHP sich so "seltsam" verhält.
|
|
|
|
|
bacon
Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Fr 07.12.2007 09:55
Titel
|
|
|
Öh. Ich kenne leider die Implementierung weder in Perl noch in PHP, aber ich kann mir vorstellen, dass solch ein Konstrukt natürlich in keiner Weise assoziativ ist. Sprich, die Klammersetzung ist wichtig. In Perl wirds wahrscheinlich zufälligerweise klappen, weil der Parser - wie du schon richtig erkannt hat - ganz blöd von Anfang bis Ende ließt. PHP scheint es umgekehrt zu machen und die Rückgabewerte berücksichtigen.
Code: | $a = true ? "erster" : false ? "zweiter" : 0 ; |
ergibt $a = "zweiter" und scheint dann in PHP
Code: | $a = ( true ? "erster" : false ) ? "zweiter" : 0 ; |
zu entsprechen. Also der Rückgabewert des ersten geklammerten Ausdrucks wird als Bedingung des nachfolgenden Ausdrucks verwendet. In diesem Fall gibt ( true ? "erster" : false ) ein "erster", nach boolean gecastet true zurück, sodass im nächsten Schritt ( (boolean)"erster" ? "zweiter" : 0 ), was "zweiter" ergibt. Erwarten würde man aber, dass bereits nach dem ersten Vergleich das Parsen des gesamte Ausdrucks abgebrochen wird und "erster" an die Variable "a" zurückgegeben wird. So ists aber nunmal nicht, das Teil wird gnadenlos bis zum Ende durchgenudelt.
Um das korrekte Ergebnis zu erhalten, müsste man also die Klammern richtig setzen:
$a = true ? "erster" : ( false ? "zweiter" : 0 );
Dann erhält man das Ergebnis, das man erwartet. ( $a = "erster" )
|
|
|
|
|
Anzeige
|
|
|
achwasweisich
Threadersteller
Dabei seit: 27.09.2007
Ort: Stuttgarter Raum
Alter: -
Geschlecht:
|
Verfasst Fr 07.12.2007 10:26
Titel
|
|
|
In der Tat funktioniert
Code: | $x = 3;
$a = $x==1 ? 1 : ($x==2 ? 2 : ($x==3 ? 3 : ($x==4 ? 4 : 0)));
print $a; |
wie erwartet.
Ich denke aber, daß diese Lösung wesentlich rechenaufwändiger ist,
als ein switch-case Konstrukt. Ist aber nur eine Vermutung, ich hab
keine Ahnung, wie PHP intern parst.
Alleine aufgrund der Lesbarkeit des Quelltextes werde ich in PHP
in solchen Fällen zu switch und case greifen. Das gibt es übrigens
in Perl nicht, daher verwende ich dort eben gern solche verschachtelten
Bedingungen, die ja im Grunde nichts anderes sind, als verschachtelte
if() ... elsif() Bedingungen.
Danke für Dein Posting.
|
|
|
|
|
|
|
|
Ähnliche Themen |
Indesign bug – oder einfach nur zu doof.
mal wieder zu doof. Hintergrund (Photoshop)
[CSS-Design] Zu doof?! Bitte mal helfen ;-)
Wo liegt hier der fehler? Ist doof nichts geht. :-(
[CSS] vertical-align XHTML oder auch: bin ich doof?
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|