Mario: Rechungen innerhalb Stringerzeugung geht nicht

Hi,

darf man keine Rechnungen innerhalb einer Stringdeklaration anstellen?

echo $acttreffer = '<p>xxx'.$_GET['s'].' xxx '.($_GET['s']*1)+($GLOBALS
['conf_userresults']*1).' von: '. number_format($GLOBALS['treffergesamt'],0,',','.').'</p>';

Angezeigt wird in dem Falle nur ab:

$GLOBALS['conf_userresults']*1).' von: '. number_format($GLOBALS['treffergesamt'],0,',','.')

Also nicht einmal die xxx xxx

Wenn ich aber das einzeln deklariere, dann gehts:

$tmp_vonbis = ($_GET['s']*1)+($GLOBALS['conf_userresults']*1);

$acttreffer = '<p>xxx'.$_GET['s'].' xxx '.$tmp_vonbis.' von: '. number_format($GLOBALS['treffergesamt'],0,',','.').'</p>';

Ist mir noch nie bei einer Rechung innerhalb einer Deklaration aufgefallen, was wohl bedeutet i.d.R. funktioniert das. Warum diesmal nicht?

Ach ja, keine Fehlermeldung wird ausgegeben, nur beim Testen habe ich mal das versucht:

echo $acttreffer = '<p>xxx'.$_GET['s'].' xxx '.($_GET['s']*1)+5.' von: '. number_format($GLOBALS['treffergesamt'],0,',','.').'</p>';

Das mag er auch nicht dann gibts Syntaxfehler.

Mario

  1. " = Stringinhalt wird geparst
    ' = Stringinhalt wird nicht geparst

  2. Hi Mario,

    darf man keine Rechnungen innerhalb einer Stringdeklaration anstellen?

    doch, natürlich funktioniert das.

    echo $acttreffer = '<p>xxx'.$_GET['s'].' xxx '. [...]

    Das ist falsch. Entweder definierst Du eine Variable oder Du läßt einen String/eine Variable ausgeben. Aber dieses Mischmasch ist kein PHP.

    Die erhaltene Fehlermeldung (die zu posten auch möglich geewesen wäre) hat Dir nicht weitergeholfen? Praktisch ist ein "error_reporting(E_ALL|E_STRICT);" am Anfang jeder PHP-Ressource. Dann bekommst Du nämlich nicht nur _alle_ Fehlermeldungen, sondern auch Hinweise zu unlogischen Anweisungen.

    Mit lieben Grüßen aus Wien

    Michi

    --
    Self-Code: ie:{ fl:| br:> va:} ls:# fo:| rl:° n4:# ss:| de:> js:{ ch:? mo:) zu:}
    Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    It is nice to be important - but it is more important to be nice.
    1. Hello,

      Das ist falsch. Entweder definierst Du eine Variable oder Du läßt einen String/eine Variable ausgeben. Aber dieses Mischmasch ist kein PHP.

      Doch, PHP ist bekannt für Mischmasch ;-)

      Meistens kann der Parser auch erraten, was sein Herrchen von ihm wollte. Aber manchmal muss der Programmierer auch noch selber denken. Durch einfache Klammereung des Numerischen Ausdruckes wird dieser zuerst berechnet und dann erst verkettet.

      PHP ist manchmal wirklich einfacher zu verstehen, wenn man schon einmal in einer Hochsprache programmiert hat. Da hat man sich dann i.d.R. als erstes ein paar Funktionen für die elegante Typkonvertierung gebaut.

      writeln('hier ist mein ' + itos(a+7) + 'ter Versuch');

      Da würde einem doch sofort klar werden, was der Programmierer vom Compiler will.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi Tom,

        Du würdest also wirklich dazu raten, ein

        <?php  
         $a="Hans";  
         $b="Grete";  
         echo $a." mag ".$b.".\n";  
        ?>
        

        gegenüber einem

        <?php  
         $a="Hans";  
         $b="Grete";  
         echo $c=$a." mag ".$b.".\n";  
        ?>
        

        zu bevorzugen bzw. sagen, dass das besseres PHP ist?

        Doch, PHP ist bekannt für Mischmasch ;-)

        Ja, aber dazu muß man doch nicht auch noch ermutigen, hm? :-)

        Mit lieben Grüßen aus Wien

        Michi

        PS: ...der noch immer sehnsüchtig auf Reaktion wartet. *g*

        --
        Self-Code: ie:{ fl:| br:> va:} ls:# fo:| rl:° n4:# ss:| de:> js:{ ch:? mo:) zu:}
        Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        It is nice to be important - but it is more important to be nice.
        1. Hi,

          ups, ich meinte es natürlich umgekehrt. Du würdest die 2. Schreibweise der ersten bevorzugen und dazu raten?

          Mit lieben Grüßen aus Wien

          Michi

          --
          Self-Code: ie:{ fl:| br:> va:} ls:# fo:| rl:° n4:# ss:| de:> js:{ ch:? mo:) zu:}
          Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          It is nice to be important - but it is more important to be nice.
        2. echo $begrüßung;

          Du würdest also wirklich dazu raten, ein

          <?php

          $a="Hans";
          $b="Grete";
          echo $a." mag ".$b.".\n";
          ?>

          
          >   
          > gegenüber einem  
          >   
          > ~~~php
          
          <?php  
          
          >  $a="Hans";  
          >  $b="Grete";  
          >  echo $c=$a." mag ".$b.".\n";  
          > ?>
          
          

          zu bevorzugen bzw. sagen, dass das besseres PHP ist?

          Du meinst es sicher andersrum. Was besser ist oder nicht, hängt vom konkreten Anwendungsfall ab. Variante 2 ist sowohl syntaktisch als auch inhaltlich genauso in Ordnung wie ein

          while ($row = fetch()) ...

          » Doch, PHP ist bekannt für Mischmasch ;-)
          Ja, aber dazu muß man doch nicht auch noch ermutigen, hm? :-)

          Aufklären ist besser als Falschaussagen.

          echo "$verabschiedung $name";

        3. Hallo,

          Du würdest also wirklich dazu raten, ein

          <?php

          $a="Hans";
          $b="Grete";
          echo $c=$a." mag ".$b.".\n";
          ?>

          
          >   
          > gegenüber einem  
          >   
          > ~~~php
          
          <?php  
          
          >  $a="Hans";  
          >  $b="Grete";  
          >  echo $a." mag ".$b.".\n";  
          > ?>
          
          

          zu bevorzugen bzw. sagen, dass das besseres PHP ist?

          wenn ich den bereits ausgegebenen String im weiteren Verlauf des Scripts exakt so noch einmal brauche, dann ja (beachte die umgedrehte Reihenfolge gegenüber deinem Beitrag).
          Soll der String aber nur einfach ausgegeben werden, ist es natürlich nicht sinnvoll, ihn noch einer Variablen zuzuweisen.

          »» Doch, PHP ist bekannt für Mischmasch ;-)
          Ja, aber dazu muß man doch nicht auch noch ermutigen, hm? :-)

          Nein, aber Dinge wie

          if ($x=func($y))

          sind durchaus elegant, wenn man weiß was man tut und nicht versehentlich die Zuweisung mit einem Vergleich verwechselt hat. So habe ich nämlich innerhalb des if-Blocks noch den tatsächlichen Wert zur Verfügung, anhand dessen die Entscheidung getroffen wurde, ohne den Code mit einer zusätzlichen Zeile unübersichtlicher zu machen.

          Ciao,
           Martin

          --
          Wenn du beim Kochen etwas heißes Wasser übrig hast, friere es ein.
          Heißes Wasser kann man immer gebrauchen.
          1. Hi Martin,

            Dinge wie if ($x=func($y)) sind durchaus elegant, wenn man weiß was man tut und nicht versehentlich die Zuweisung mit einem Vergleich verwechselt hat. So habe ich nämlich innerhalb des if-Blocks noch den tatsächlichen Wert zur Verfügung, anhand dessen die Entscheidung getroffen wurde, ohne den Code mit einer zusätzlichen Zeile unübersichtlicher zu machen.

            ich verstehe, was Du meinst und kann Dir auch folgen, mein Einwand hat sich lediglich auf die Situation einer echo-Ausgabe in Kombination mit Stringverkettung bezogen. (Abgesehen davon, dass ich zu blöd war, um meine Aussage und die 2 PHP-Beispiele nicht zu verwechseln. *g*)

            Mit lieben Grüßen aus Wien

            Michi

            --
            Self-Code: ie:{ fl:| br:> va:} ls:# fo:| rl:° n4:# ss:| de:> js:{ ch:? mo:) zu:}
            Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            It is nice to be important - but it is more important to be nice.
            1. Hello,

              ich verstehe, was Du meinst und kann Dir auch folgen, mein Einwand hat sich lediglich auf die Situation einer echo-Ausgabe in Kombination mit Stringverkettung bezogen. (Abgesehen davon, dass ich zu blöd war, um meine Aussage und die 2 PHP-Beispiele nicht zu verwechseln. *g*)

              PHP-Anfänger schreiben das alles gerne durcheinander: HTML, JavaScript, PHP-Berchnungen, PHP-Ausgaben, CSS. Fehlt eigentlich nur noch ein bisschen MM-Code und Flash.

              Und auch wenn die Entwicklung in der automatischen Datenverarbeitung eigentlich inzwischen über den Stapelbetrieb weg ist, ist der trotzdem immer noch nicht ungülitg. Und seine wichtigste Helferin heißt immer noch EVA.

              Und ich plädiere dafür auch heute immer noch dafür, möglichst Benutzeraktionen, Datenhaltung, Datenbeschaffung, Datenverarbeitung, Datenformatierung und Ausgabe strikt voneinander zu trennen. Gerade in der "Webtechnologie", also unserern hier meistens besprochenen Client-Server-Systemen, kommt einem eine solche strikte Trennung entgegen.

              Und wenn der Programmierer dann auch noch den Allman Coding Style beherzigt, dann kann er mein Freund werden :-)

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
  3. Hallo,

    darf man keine Rechnungen innerhalb einer Stringdeklaration anstellen?

    doch, sicher. Ausdrücke lassen sich beliebig verschachteln, solange sie typkompatibel sind (oder entsprechend umgewandelt werden können). Sogar die Zuweisung innerhalb eines echo-Statements, die du hier zeigst, ist erlaubt, wenn auch sehr ungewöhnlich.

    echo $acttreffer = '<p>xxx'.$_GET['s'].' xxx '.($_GET['s']*1)+($GLOBALS ['conf_userresults']*1).' von: '. number_format($GLOBALS['treffergesamt'],0,',','.').'</p>';

    Mal abgesehen davon, dass du den Gesamtausdruck hier im Posting-Text mit einem Zeilenumbruch auseinandergerissen hast: Ist das dein exakter Quellcode? Kein Abschreibfehler? Denn der Code ist formal korrekt.
    Ich drösel das mal auf:

    echo $acttreffer =
         '<p>xxx'
       . $_GET['s']
       . ' xxx '
       . ($_GET['s']*1)+($GLOBALS['conf_userresults']*1)
       . ' von: '
       . number_format($GLOBALS['treffergesamt'],0,',','.')
       . '</p>';

    Jetzt sieht man auch, dass da eine Addition zweier numerischer Werte in einer Stringverkettung steht. Was bindet stärker: Stringverkettung oder Addition? Ich würde den numerischen Teilausdruck mal klammern.

    Wenn ich aber das einzeln deklariere, dann gehts:
    $tmp_vonbis = ($_GET['s']*1)+($GLOBALS['conf_userresults']*1);

    Das würde mich in meiner Ahnung bestärken.

    Ach ja, keine Fehlermeldung wird ausgegeben, nur beim Testen habe ich mal das versucht:

    echo $acttreffer = '<p>xxx'.$_GET['s'].' xxx '.($_GET['s']*1)+5.' von: '. number_format($GLOBALS['treffergesamt'],0,',','.').'</p>';
    Das mag er auch nicht dann gibts Syntaxfehler.

    Äh, natürlich: Der Teilausdruck "5." wird als Fließkommazahl interpretiert, und dahinter fehlt dann der nächste Operator. Ein Leerzeichen an der richtigen Stelle wirkt Wunder. ;-)

    Ciao,
     Martin

    --
    Zwei Stammtischbrüder:
    Hier steht, dass laut Statistik über 60 Prozent aller Ehefrauen fremdgehen.
    Was soll ich mit dieser Information? Ich brauche Namen, Fotos, Telefonnummern ... !
  4. echo $begrüßung;

    darf man keine Rechnungen innerhalb einer Stringdeklaration anstellen?

    Doch, darf man. Man muss aber dabei die Operatorenrangfolge beachten oder explizit mit Klammern für die gewünschte Berechnungsreihenfolge sorgen. Der Stringverkettungsoperator und Strichrechnung haben die gleiche Priorität, also wird in deinem Fall stur von links nach rechts berechnet.

    echo $acttreffer =

    Ungewöhnlich, vielleicht auch unsinnig, aber syntaktisch korrekt.

    '<p>xxx'.$_GET['s'].' xxx '.

    Bis hier hin, verkettest du Strings.

    ($_GET['s']*1)

    Durch das *1 machst du aus der Eingabe eine Zahl. Mit intval() oder einem Typecast würde deine Absicht hinter diesem Konstrukt deutlicher.

    +($GLOBALS['conf_userresults']*1)

    Bis jetzt hast du einen String, der nicht mit einer Zahl anfängt. Zu dem möchtest du eine Zahl addieren. Der String wird dazu implizit in eine Zahl umgewandelt. Da er nicht mit einer auswertbaren Zahl anfängt, ist sein nummerischer Wert 0. Dazu addierst du etwas.

    .' von: '. number_format($GLOBALS['treffergesamt'],0,',','.').'</p>';

    Anschließend fährt du mit Stringverkettung fort, also wird der Zahlenwert aus der Addition mit 0 in einen String umgewandelt.

    Angezeigt wird in dem Falle nur ab:
    $GLOBALS['conf_userresults']*1).' von: '. number_format($GLOBALS['treffergesamt'],0,',','.')

    Und das ist das logische Ergebnis davon.

    Wenn ich aber das einzeln deklariere, dann gehts:

    Du hast nun eine andere Berechnungsreihenfolge.

    Ach ja, keine Fehlermeldung wird ausgegeben, nur beim Testen habe ich mal das versucht:

    Ist ja auch aus PHP-Sicht kein Fehler drin.

    echo $acttreffer = '<p>xxx'.$_GET['s'].' xxx '.($_GET['s']*1)+5.' von: '. number_format($GLOBALS['treffergesamt'],0,',','.').'</p>';
    Das mag er auch nicht dann gibts Syntaxfehler.

    Im Zahlenkontext steht ein Punkt für das Dezimaltrennzeichen. Bei dir folgt aber ein String und keine Ziffern.

    echo "$verabschiedung $name";