Mehrzeilige ECHO-Anweisung?
Nils B.
- php
Hallo,
unter normalen Umständen kann man in PHP ja folgendermaßen vorgehen, um eine bedingte Ausgabe zu schaffen,
<?php
$test = "x";
if($test=="x")
{
echo "<p>Beispiel</p>";
}
?>
Im vorliegenden Fall schreibt man ja <p>Beispiel</p> in den Browser, wenn die Variable den Wert x annimmt. Nun möchte ich aber mehr als nur eine Zeile auf den Bildschirm schreiben, also nicht nur <p>Beispiel</p>, sondern ganze Texte und nicht mühsam die Anführungszeichen im HTML-Code maskieren und auch nicht alles in einer Zeile hintereinander weg. Wie kann ich die Ausgabe wieder als HTML übergeben, statt über das echo in PHP? Geht das überhaupt?
Grüße
Nils
Geht das überhaupt?
wenn du primär html ausgibst mit doppelten quotes, solltest du in php die quotes umdrehen, dann musst du nicht so viel escapen
zudem ist es kein problem mehrzeiligen code auszugeben
gute variante bei wenig html code:
<?php
$test = 'x';
$meinevariable = 'abc';
if($test=='x')
{
echo '<p>Beispielabsatz <span>' . $meinevariable . '</span></p>' . "\n";
echo '<p>Beispielabsatz2</p>' . "\n";
echo '<p>Beispielabsatz3</p>' . "\n";
echo '<p>Beispielabsatz4</p>' . "\n";
}
?>
<?php
$test = 'x';
$meinevariable = 'abc';
if($test=='x')
{
?>
<p>Beispielabsatz <span><?php echo $meinevariable; ?></span></p>
<p>Beispielabsatz2</p>
<p>Beispielabsatz3</p>
<p>Beispielabsatz4</p>
<?php
}
?>
die variante mit php auf und zu ist aber vergleichsweise langsamer und besonders bei WIRKLICH langen schleifen mehrere hundertausend zeilen code merkt man deutliche performanceunterschiede, da der interpreter durch die ewigen "interpreter hier starten, hier aufhören" anweisungen gebremst wird
in asp/vbs ist dies übrigens sogar bei kurzen scripten schon spürbar
alternativ kann statt
<?php echo $meinevariable; ?>
folgende syntax verwenden
<?=$meinevariable;?>
dafür muss short_open_tag eingeschaltet sein, das ist aber in verbindung mit xml NICHT empfehlenswert da ansonsten <?xml ?> ebenfalls als php interpretiert werden könnte
Hi,
ich schreibe solchen Code:
echo '<p>Beispielabsatz <span>' . $meinevariable . '</span></p>' . "\n";
echo '<p>Beispielabsatz2</p>' . "\n";
echo '<p>Beispielabsatz3</p>' . "\n";
echo '<p>Beispielabsatz4</p>' . "\n";
ein bisschen anders weil ich denke das damit ein klein bisschen Performace gespart wird (weil weniger anweisungen), bin mir da aber nicht sicher:
echo
'<p>Beispielabsatz <span>' . $meinevariable . '</span></p>' . "\n" .
'<p>Beispielabsatz2</p>' . "\n" .
'<p>Beispielabsatz3</p>' . "\n" .
'<p>Beispielabsatz4</p>' . "\n"
;
ein bisschen anders weil ich denke das damit ein klein bisschen Performace gespart wird (weil weniger anweisungen), bin mir da aber nicht sicher:
das wär mal interessant auszuprobieren, wie php das sieht
wenn du spass an der freude hast, probiers bitte aus und sag mir das ergebnis
100.000 zeilen mit deiner variante und 100.000 zeilen mit der von mir vorgeschlagenen sollte ggf unterschiede aufzeigen
Hi suit,
Wenn du mir grad noch sagst wie ich die vergangen Zeit messen kann mach ichs gerne.
Mfg Zul
Hi frankx,
Was willst du uns jetzt damit sagen? Falls du meinst das so etwas nicht so oft vorkommt, dass die Anzahl 4-stellig wird, denke ich hast du dich geirrt. Es gibt doch garantiert Webseiten die mehr als 1000-Zeilen Code liefern, oder?
Mfg Zul
Hellihello
Mh, ich dachte da stünde, dass die Länge eines einzelnen Dokumentes eher die vernchlässigbare Größe wäre, eher die Häufigkeit der Ausgabe relevant wäre.
Als 10.000 Zeilen Code ist was anderes als 10.000 mal eine zeile Code.
Dank und Gruß,
Als 10.000 Zeilen Code ist was anderes als 10.000 mal eine zeile Code.
so sehe ich das auch, da eine schleife vom interpreter in eine schleife übersetzt wird, einzelne zeilen in einzelne zeilen
die frage ist was hier schneller ist ;)
Wenn du mir grad noch sagst wie ich die vergangen Zeit messen kann mach ichs gerne.
einfach vor und nach dem script und die differenz vergleichen
microtime()
Hallo,
echo '<p>Beispielabsatz <span>' . $meinevariable . '</span></p>' . "\n";
echo '<p>Beispielabsatz2</p>' . "\n";
echo '<p>Beispielabsatz3</p>' . "\n";
echo '<p>Beispielabsatz4</p>' . "\n";
echo
'<p>Beispielabsatz <span>' . $meinevariable . '</span></p>' . "\n" .
'<p>Beispielabsatz2</p>' . "\n" .
'<p>Beispielabsatz3</p>' . "\n" .
'<p>Beispielabsatz4</p>' . "\n"
;
Eigentlich sind beide Varianten schlecht, denn mit dem Punkt-Operator erzeugt ihr jedes mal einen neuen temporären String. Wofür? Ihr speichert ihn doch nicht mal irgendwo, ihr gebt ihn doch nur aus! Der letzte Code erzeugt ca. 10 temporäre Strings, die nach der Ausgabe wieder im Nirvana verschwinden. echo kann man praktischerweise beliebig viele Parameter zur Ausgabe übergeben, die alle nacheinander ausgegeben werden. Besser ist also:
~~~php
echo
'<p>Beispielabsatz <span>', $meinevariable, '</span></p>', "\n",
'<p>Beispielabsatz2</p>', "\n",
'<p>Beispielabsatz3</p>', "\n",
'<p>Beispielabsatz4</p>', "\n"
;
Gruss,
OhneName
Moin!
ein bisschen anders weil ich denke das damit ein klein bisschen Performace gespart wird (weil weniger anweisungen), bin mir da aber nicht sicher:
echo
'<p>Beispielabsatz <span>' . $meinevariable . '</span></p>' . "\n" .
'<p>Beispielabsatz2</p>' . "\n" .
'<p>Beispielabsatz3</p>' . "\n" .
'<p>Beispielabsatz4</p>' . "\n"
;
Warum nicht:
~~~php
echo '<p>Beispielabsatz <span>' . $meinevariable . '</span></p>
<p>Beispielabsatz2</p>
<p>Beispielabsatz3</p>
<p>Beispielabsatz4</p>
';
Die vielen Zusammenfügungen und Interpretationen der Zeilenumbrüche kosten auch Prozessortakte.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Hi fastix,
Warum nicht:
echo '<p>Beispielabsatz <span>' . $meinevariable . '</span></p>
<p>Beispielabsatz2</p>
<p>Beispielabsatz3</p>
<p>Beispielabsatz4</p>
';
Ganz einfach: Ziel bei meiner Lösung war auch gleichseitig den Code sowohl in HTML als auch in PHP lesbar zu halten. Wenn man dann sowohl HTML als auch PHP einrücken will gibts Probleme.
Mfg Zul
Moin!
Ganz einfach: Ziel bei meiner Lösung war auch gleichseitig den Code sowohl in HTML als auch in PHP lesbar zu halten. Wenn man dann sowohl HTML als auch PHP einrücken will gibts Probleme.
Dann wäre es an der Zeit über ein Template-Sytem nachzudenken, das heißt die HTML-Seite (Darstellung) vom PHP-Quellode (Logik) zu trennen. Ich habe mir für diesen "Job" eine ziemlich schlanke Lösung gebastelt:
<?php
## des fastix kleine 'Template-Engine'
define('HTML_DEBUG',false);
## read an print the template
function Print_Template($template_file, $template_data=array()) {
@$template_size=filesize($template_file);
if (! $template_size) {
$template_data['<strong>Error (fatal)</strong>']='<strong>File "<em>'.$template_file.'"</em> not exists or have size 0!<strong>';
$template='<html><head><title>Testing the Output...</title><meta http-equiv=\'Content-Type\' content=\'text/html; charset=\'ISO-8859-15\' /><style type=\'text/css\'>th {background-color:#ccf;padding:0.2em} td {padding:0.2em}</style></head><body><table border=\'1\'><tr><th colspan=\'2\'>Values of $template_data</th></tr><tr><th>Key</th><th>Value</th></tr>';
$counter=0;
foreach (array_keys($template_data) as $key) {
$line='l'.$counter++;
$template.='<tr id="'.$line.'" onmouseover=\'document.getElementById("'.$line.'").style.backgroundColor="#ffc"\' onmouseout=\'document.getElementById("'.$line.'").style.backgroundColor="#fff"\'>
<td>'.$key.'</td><td>'.$template_data[$key].'</td></tr>';
}
$template.='</table></body></html>';
} else {
$FH = fopen ($template_file, "r") or die ('fatal: can not read '.$template_file);
$template = fread ($FH, $template_size);
fclose ($FH);
if (! HTML_DEBUG) {
$search=array("\n", "\r", "\t");
$template = str_replace ($search, '', $template);
}
foreach (array_keys($template_data) as $key) {
$search = '[[tpl id=\''.$key.'\']]';
#die('str_replace ('.$search.', '.$template_data[$key].', $template);)');
$template = str_replace ($search, $template_data[$key], $template);
$search = '[[tpl id="'.$key.'"]]';
$template = str_replace ($search, $template_data[$key], $template);
$search = '[[tpl id='.$key.']]';
$template = str_replace ($search, $template_data[$key], $template);
}
}
print $template;
}
## functions:
function Encoding_This($str, $str_encoding_to='ISO-8859-15', $str_encoding_from='ISO-8859-15') {
if ($str_encoding_to != $str_encoding_from) {
return mb_convert_encoding($str, $str_encoding_to, $str_encoding_from);
} else {
return $str;
}
}
function Print_Template_HTML_Header ($encoding_to='ISO-8859-15') {
header('Content-Type: text/html; charset='.$encoding_to);
}
?>
In Template.html sieht es dann so aus:
<html>
<head>
....
</head>
<body>
<h1>[[tpl id='Seitentitel']]</h1>
<p>Heute werden [[tpl id="Bemerkung"]] [[tpl id=MaxGradZahl]] °C.</p>
...
</body>
</html>
Im PHP-Code muss
$tpl['Seitentitel']='Wie warm wird es heute?';
$tpl['MaxGradZahl']=3*4;
if ($tpl['MaxGradZahl'] < 12) {
$tpl['Bemerkung']='gerade mal';
} else {
$tpl['Bemerkung']='immerhin';
}
...
Print_Template('./templates/Template.html', $tpl)
Die Funktionen Encoding_This() und Print_Template_HTML_Header() haben hier keine Bedeutungen werden aber manchmal benötigt...
Ein solches template-System ist die beste Art deine sauberen Einrückungen zu bewirken. Mit define('HTML_DEBUG',true);
in der template.php kannst Du diese im resultieren HTML-Quelltext auch sichtbar machen.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Hellihello
unter normalen Umständen kann man in PHP ja folgendermaßen vorgehen, um eine bedingte Ausgabe zu schaffen,
<?php
$test = "x";if($test=="x")
{
echo "<p>Beispiel</p>";
}?>
Im vorliegenden Fall schreibt man ja <p>Beispiel</p> in den Browser, wenn die Variable den Wert x annimmt. Nun möchte ich aber mehr als nur eine Zeile auf den Bildschirm schreiben, also nicht nur <p>Beispiel</p>, sondern ganze Texte und nicht mühsam die Anführungszeichen im HTML-Code maskieren und auch nicht alles in einer Zeile hintereinander weg. Wie kann ich die Ausgabe wieder als HTML übergeben, statt über das echo in PHP? Geht das überhaupt?
Natürlich und ganz besonders, das PHP eine Templatesprache ist.
<p>ganz viel html</p>
<?php if ($x):?>
<p> ganz viel text </p>
<?php endif;?>
<p>ganz viel html</p>
Stichwort: alternative Syntax.
Dank und Gruß,
Moin!
Nun möchte ich aber mehr als nur eine Zeile auf den Bildschirm schreiben, also nicht nur <p>Beispiel</p>, sondern ganze Texte und nicht mühsam die Anführungszeichen im HTML-Code maskieren und auch nicht alles in einer Zeile hintereinander weg. Wie kann ich die Ausgabe wieder als HTML übergeben, statt über das echo in PHP? Geht das überhaupt?
heredoc-Syntax:
echo <<<END
Hier wird die "here document"-Syntax verwendet, um mehrere
Zeilen mit $variablen Interpolation auszugeben. Beachten Sie,
dass das sich das "here document"-Endzeichen in einer Zeile
mit nur einem Strichpunkt aber ohne Leerzeichen o.ä. stehen muss!
END;
Quelle: http://de.php.net/manual/de/function.echo.php
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®