Matthias: Mit PHP PHP-Start- und Endkennzeichen in Datei schreiben

Hallo,

ich bastele mir gerade etwas Code, welcher aus XML-Dokumenten Webseiten erstellt. Dabei versuche ich in die zu generierende .php-Datei folgendes zu schreiben:

  
                       <div id="men">  
                          <?php  
                            include( "menue_include.inc" );  
                          ?>  
                       </div>  

Dazu habe ich mir folgende Function gebaut:

  
    public function getFileBodyMenue()  
    {  
      return <<<CODE  
                        </div>  
                      </td>  
                    </tr>  
  
                    <tr>  
                      <td>  
                        <div id="men">  
                          {$this->phpTagStart}  
                            include( "menue_include.inc" );  
                          {$this->phpTagEnd}  
                        </div>  
                      <td>  
                        <div id="cont">  
CODE;  
    }  

Das funktioniert aber nicht. Ich bekomme es nicht hin, dass <?php und ?> in der Zieldatei stehen.

Hier ist der Code, der in die Zieldatei schreibt:

  
fwrite( $this->chunkHandle , "\n".$data );  

, wobei sich zu diesem Zeitpunkt in $data das return-Ergebnis aus getFileBodyMenue() steht.

Hier meine bisherigen Ansätze:

$this->phpTagStart und $this->phpTagEnd sind wie folgt definiert:

  
      $this->phpTagStart = html_entity_decode( "&lt;?php" );  
      $this->phpTagEnd   = html_entity_decode( "?&gt;"    );  

ergibt:

  
<div id="men">  
                                                  </div>  

$this->phpTagStart und $this->phpTagEnd sind wie folgt definiert:

  
      $this->phpTagStart =     chr( "60" ).'?php';  
      $this->phpTagEnd   = '?'.chr( "62" );  

ergibt:

  
<div id="men">  
                                                  </div>  

$this->phpTagStart und $this->phpTagEnd sind wie folgt definiert:

  
      $this->phpTagStart = "&#60;?php";  
      $this->phpTagEnd   = "?&#62;";  

ergibt:

  
                        <div id="men">  
                          &#60;?php  
                            include( "menue_include.inc" );  
                          ?&#62;  
                        </div>  

$this->phpTagStart und $this->phpTagEnd sind wie folgt definiert:

  
      $this->phpTagStart = "<?php";  
      $this->phpTagEnd   = "?>";  

ergibt:

  
                        <div id="men">  
                                                  </div>  

Kann mir jemand einen Tip geben, wie ich den String formulieren muss, damit in meine Zieldatei mit fwrite <?php und ?> geschrieben wird?

Vielen Dank.

Gruß

Matthias

  1. Hallo Matthias,

    ich bastele mir gerade etwas Code, welcher aus XML-Dokumenten Webseiten erstellt. Dabei versuche ich in die zu generierende .php-Datei folgendes zu schreiben:

    <div id="men">

    <?php
                                include( "menue_include.inc" );
                              ?>
                           </div>

      
    das sollte eigentlich eine leichte Übung sein.  
      
    
    > 1)  
    > ~~~php
    
    $this->phpTagStart = html_entity_decode( "&lt;?php" );  
    
    > $this->phpTagEnd   = html_entity_decode( "?&gt;"    );
    
    

    ergibt:

    <div id="men">
                                                      </div>

      
    Den String erst in HTML-Entities zu notieren und dann durch html\_entity\_decode() zu nudeln, ist zwar überflüssig, sollte aber zumindest das gewünschte Ergebnis bringen.  
      
      $this->phpTagStart = '<' . '?php';  
      $this->phpTagEnd   = '?' . '>';  
      
    ... sollte dasselbe bewirken. Vermeide nur, '<?php' und '?>' am Stück zu schreiben, das könnte den Parser irritieren und dein Script vorzeitig beenden. Deshalb die zerstückelte Schreibweise.  
      
    
    > 2)  
    > ~~~php
    
    $this->phpTagStart =     chr( "60" ).'?php';  
    
    > $this->phpTagEnd   = '?'.chr( "62" );
    
    

    ergibt:

    <div id="men">
                                                      </div>

      
    Dasselbe in Grün. Wobei es hanebüchener Unsinn ist, das Argument von chr(), das ja eine Zahl sein soll, als String zu übergeben.  
      
    
    > 3)  
    > ~~~php
    
    $this->phpTagStart = "&#60;?php";  
    
    > $this->phpTagEnd   = "?&#62;";  
    > 
    
    

    ergibt:

    <div id="men">
                              &#60;?php
                                include( "menue_include.inc" );
                              ?&#62;
                            </div>

      
    Mir schwant, dass du dir das Ergebnis in der Browserdarstellung ansiehst, und nicht im Quellcode. Dass ein Browser den gesamten Rattenschwanz von <?php bis ?> als unbekanntes Tag ignoriert, ist völlig klar. Daher sind die Varianten 1 und 2 nach meinem Dafürhalten absolut okay, nur deine Beurteilung ist vermutlich falsch. Variante 4 hätte ich vermieden, weil sie syntaktisch nicht ganz eindeutig für den Parser ist.  
      
    Ciao,  
     Martin  
    
    -- 
    Er war ein Mann wie ein Baum. Sie nannten ihn Bonsai.  
      
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hi!

      $this->phpTagStart = '<' . '?php';
        $this->phpTagEnd   = '?' . '>';

      ... sollte dasselbe bewirken. Vermeide nur, '<?php' und '?>' am Stück zu schreiben, das könnte den Parser irritieren und dein Script vorzeitig beenden. Deshalb die zerstückelte Schreibweise.

      Welchen Parser meinst du? :-) Den PHP-Parser irritiert das schon mal nicht. Solange der String korrekt als solcher erkannt wird, sind darin enthaltene <?php und ?> Zeichenfolgen wie jede andere auch (von Variablen namen abgesehen).

      Lo!

      1. Hallo,

        Vermeide nur, '<?php' und '?>' am Stück zu schreiben, das könnte den Parser irritieren und dein Script vorzeitig beenden. Deshalb die zerstückelte Schreibweise.
        Welchen Parser meinst du? :-) Den PHP-Parser irritiert das schon mal nicht.

        doch, genau den meinte ich.
        Zugegeben, ich hab's jetzt nicht ausprobiert. Aber ich vermeide solche Zweifelsfälle ganz gern von vornherein.
        Ich weiß zum Beispiel, dass die üblichen Tagsoup-Parser der gängigen Browser beim erstbesten Vorkommen von </ einen Javascript-Block für beendet erklären, auch wenn "</" innerhalb eines Strings steht. Ein ähnliches Verhalten hatte ich beim PHP-Parser auch unterstellt. Präventiv, sozusagen.

        Solange der String korrekt als solcher erkannt wird, sind darin enthaltene <?php und ?> Zeichenfolgen wie jede andere auch (von Variablen namen abgesehen).

        Okay, gut zu wissen. :-)

        Ciao,
         Martin

        --
        Most experts agree: Any feature of a program that you can't turn off if you want to, is a bug.
        Except with Microsoft, where it is just the other way round.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hi!

          Ich weiß zum Beispiel, dass die üblichen Tagsoup-Parser der gängigen Browser beim erstbesten Vorkommen von </ einen Javascript-Block für beendet erklären, auch wenn "</" innerhalb eines Strings steht. Ein ähnliches Verhalten hatte ich beim PHP-Parser auch unterstellt. Präventiv, sozusagen.

          HTML und Javascript sind zwei zusammengemixte Systeme. Der HTML-Parser interessiert sich erstmal nicht für das Zeug, das da nach dem öffnenden script-Tag kommt und sucht einfach nur das Ende. Es ist ja nicht gesagt, dass da zwingend eine Sprache kommt, die der Browser üblicherweise nativ beherrscht, wie eben Javascript. Ein Szenario könnte sein, dass ein Plugin sich um den Script-Code kümmert. Und um dem den Code übergeben zu können, wäre auch schon der HTML-Parser auf Kenntnisse der Syntax angewiesen. Das ergäbe eine ziemliche Verzahnung beider Systeme.

          PHP hingegen ist nur ein System. Das HTML darum, in dem es meist angesiedelt ist, wird unbeachtet durchgereicht. Ab <?php parst der PHP-Parser los und wenn da ein Stringliteral kommt, muss das zuerst abgeschlossen sein, bevor ein ?> wieder als was anderes als zwei Zeichen erkannt wird. Aber mal angenommen, er würde über ein weiteres <?php stolpern, was sollte er damit anderes machen als eine Syntax-Fehlermeldung ausgeben. Insofern kann man es auch ohne Kenntnis der Harmlosigkeit von <?php ?> in Stringliteralen auf einen Versuch ankommen lassen, die Zeichenfolge so zu notieren.

          Lo!

          1. »»Mir schwant, dass du dir das Ergebnis in der Browserdarstellung
            »»ansiehst, und nicht im Quellcode.

            Quatsch! Sowas würde ich nie tun!! *hüstelschäm*

            Ja, habe es nun mit

              
                  $this->phpTagStart = '<' . '?php';  
                  $this->phpTagEnd   = '?' . '>';  
            
            

            gelöst, funktioniert einwandfrei.

            Vielen Dank! Manchmal macht man so dumme Sachen...

            Gruß

            Matthias

            1. Hallo,

              Ja, habe es nun mit

              $this->phpTagStart = '<' . '?php';

              $this->phpTagEnd   = '?' . '>';

              
              > gelöst, funktioniert einwandfrei.  
                
              und wenn du dir den Beitrag von dedlfix auch noch zu Herzen nimmst und erkennst, dass meine Sorge bezüglich der Problematik von '<?' oder '?>' im String unbegründet ist, kannst du die String-Bastelei auch noch eliminieren und die PHP-Tags im Klartext schreiben.  
                
              
              > Vielen Dank! Manchmal macht man so dumme Sachen...  
                
              Verdammt, wo ist der Wald geblieben? Überall nur Bäume ... ;-)  
                
              So long,  
               Martin  
              
              -- 
              Auf jeden Menschen auf der ganzen Welt entfallen statistisch gesehen etwa 3000 Spinnen, wie Wissenschaftler jetzt festgestellt haben.  
              Wer will meine haben? Denn ich will sie bstimmt nicht.  
                
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              
              1. und wenn du dir den Beitrag von dedlfix auch noch zu Herzen nimmst und erkennst, dass meine Sorge bezüglich der Problematik von '<?' oder '?>' im String unbegründet ist, kannst du die String-Bastelei auch noch eliminieren und die PHP-Tags im Klartext schreiben.

                Das ergibt ein unschönes Ergebnis in meinem Editor. Der erkennt auch in einem String ?>, alles was danach kommt wird dann wie html-Syntax dargestellt, auch wenn es noch PHP-Code ist.

                Das verwirrt mich nur noch mehr ;-)

                Gruß

                Matthias

                1. Hi!

                  Das ergibt ein unschönes Ergebnis in meinem Editor. Der erkennt auch in einem String ?>, alles was danach kommt wird dann wie html-Syntax dargestellt, auch wenn es noch PHP-Code ist.
                  Das verwirrt mich nur noch mehr ;-)

                  Verständlich. Universaleditoren werten oftmals nicht die Syntax in ordentlicher Form aus, weswegen man dann zu solchen Krücken greift. Auf PHP zugeschnittene IDEs haben diese Probleme nicht, allerdings sind sie meist recht umfangreich groß.

                  Lo!