Nils B.: Mehrzeilige ECHO-Anweisung?

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

  1. 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

    1. 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"  
      ;
      
      1. 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

        1. Hi suit,

          Wenn du mir grad noch sagst wie ich die vergangen Zeit messen kann mach ichs gerne.

          Mfg Zul

          1. Hellihello

            https://forum.selfhtml.org/?t=169158&m=1104560

            Dank und Gruß,

            frankx

            --
            tryin to multitain  - Globus = Planet != Welt
            1. 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

              1. 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ß,

                frankx

                --
                tryin to multitain  - Globus = Planet != Welt
                1. 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 ;)

          2. 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()

      2. 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

      3. 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®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
        1. 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
          
          1. 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

            • die template.php mit include './includes/template.php' geladen werden.
            • ein hasch existieren, der die Schlüssel und Daten beinhaltet. z.B...
              $tpl['Seitentitel']='Wie warm wird es heute?';  
                $tpl['MaxGradZahl']=3*4;  
                if ($tpl['MaxGradZahl'] < 12) {  
                   $tpl['Bemerkung']='gerade mal';  
                } else {  
                   $tpl['Bemerkung']='immerhin';  
                }  
                ...
            
            • Die Funktion aufgerufen werden:
              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®

            --
            Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
  2. 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ß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
  3. 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®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development