Rechungen innerhalb Stringerzeugung geht nicht
Mario
- php
0 Ollo0 MichiN0 Tom0 MichiN0 Nachtrag
MichiN0 dedlfix
0 Der Martin
0 Der Martin
2 dedlfix
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
" = Stringinhalt wird geparst
' = Stringinhalt wird nicht geparst
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
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
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*
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
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";
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
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
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
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
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";