mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Fr 29.03.2024 10:21 Benutzername: Passwort: Auto-Login

Thema: PHP zu doof? vom 07.12.2007


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> PHP zu doof?
Autor Nachricht
achwasweisich
Threadersteller

Dabei seit: 27.09.2007
Ort: Stuttgarter Raum
Alter: -
Geschlecht: Männlich
Verfasst Fr 07.12.2007 09:06
Titel

PHP zu doof?

Antworten mit Zitat Zum Seitenanfang

Moin,
ich habe folgendes Konstrukt oft und gern in Perl benutzt.
Aber scheinbar versteht PHP nicht, was ich will und liefert
immer das Ergebnis
Code:
4


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
Code:
$x==3 ? 3
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.
  View user's profile Private Nachricht senden
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Fr 07.12.2007 09:55
Titel

Antworten mit Zitat Zum Seitenanfang

Ö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" )
  View user's profile Private Nachricht senden
Anzeige
Anzeige
achwasweisich
Threadersteller

Dabei seit: 27.09.2007
Ort: Stuttgarter Raum
Alter: -
Geschlecht: Männlich
Verfasst Fr 07.12.2007 10:26
Titel

Antworten mit Zitat Zum Seitenanfang

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.
  View user's profile Private Nachricht senden
 
Ä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?
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


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.