thomas: php-shorttags und xhtml valid

Um XHTML-valid zu bleiben sollte man am Beginn des Files eine XML-Deklaration unterbringen.
Folgendes Problem: ein php-server, der short-tags (also nur '<?') akzeptiert, frisst den xml-tag und macht logischerweise ncihts mehr, weil er mit dem Inhalt des Tags nichts anzufangen weiß.
Gibt es irgendwelche Möglichkeiten, short-tags auf dem Server eingeschaltet zu lassen, und trotzdem XHTML-valid zu bleiben?

lg thomas

  1. Hallo,

    Um XHTML-valid zu bleiben sollte man am Beginn des Files eine XML-Deklaration unterbringen.
    Folgendes Problem: ein php-server, der short-tags (also nur '<?') akzeptiert, frisst den xml-tag und macht logischerweise ncihts mehr, weil er mit dem Inhalt des Tags nichts anzufangen weiß.
    Gibt es irgendwelche Möglichkeiten, short-tags auf dem Server eingeschaltet zu lassen, und trotzdem XHTML-valid zu bleiben?

    wie wäre es mit
    <?php print '<?xml version="1.0" encoding="UTF-8"?>'; ?>

    mfg
    Twilo

  2. Hallo Thomas,

    Um XHTML-valid zu bleiben sollte man am Beginn des Files eine XML-Deklaration unterbringen.
    Folgendes Problem: ein php-server, der short-tags (also nur '<?') akzeptiert, frisst den xml-tag und macht logischerweise ncihts mehr, weil er mit dem Inhalt des Tags nichts anzufangen weiß.
    Gibt es irgendwelche Möglichkeiten, short-tags auf dem Server eingeschaltet zu lassen, und trotzdem XHTML-valid zu bleiben?

    du kannst die Deklaration mit PHP ausgeben: <?php echo("<?..."); ?>

    Schöne Grüße
    Julian

    --
    "Real programmers can write assembly code in any language." - Larry Wall
  3. Hallo thomas,

    Um XHTML-valid zu bleiben sollte man am Beginn des Files eine XML-Deklaration unterbringen.
    Folgendes Problem: ein php-server, der short-tags (also nur '<?') akzeptiert, frisst den xml-tag und macht logischerweise ncihts mehr, weil er mit dem Inhalt des Tags nichts anzufangen weiß.
    Gibt es irgendwelche Möglichkeiten, short-tags auf dem Server eingeschaltet zu lassen, und trotzdem XHTML-valid zu bleiben?

    Ich löse das Problem derzeit wie folgt:

    <?php  
     echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";  
     /* ... */  
    ?>
    

    Bis dann!

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    http://emmanuel.dammerer.at/selfcode.html
    1. Hallo,

      echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";

      warum schreiben das alle eigentlich so kompliert?

      folgende Zeile finde ich z.B. viel übersichlicher
      echo '<?xml version="1.0" encoding="UTF-8"?>';
      1. muss man dort die " nicht escapen
      2. ist diese Anweisung sogar ein paar Millisekunden schneller ;-)

      mfg
      Twilo

      1. Hallo Twilo.

        warum schreiben das alle eigentlich so kompliert?

        Wer sagt denn, dass das alle machen? ;)
        Ich z. B. verzichte auf den XML-Prolog und hoffe, dass der IE 7 diesen in der ersten Zeile akzeptieren kann, ohne in den "Müll-Modus" zu wechseln.

        1. muss man dort die " nicht escapen

        Richtig. Der einzige Nachteil, der mir zu den '' einfällt, ist, dass ein \n als Text ausgegeben wird.

        1. ist diese Anweisung sogar ein paar Millisekunden schneller ;-)

        Naja, kommt auf die Umgebung an.

        Gruß, Ashura

        --
        Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
        Try it: Become an Opera Lover in 30 days
        Meine Browser: Opera 8.0 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
        IE Layout-Workaround №1: <!--[if IE]><style type="text/css">*{display:none;}</style><![endif]-->
        1. Hallo,

          Richtig. Der einzige Nachteil, der mir zu den '' einfällt, ist, dass ein \n als Text ausgegeben wird.

          dann kann man aber noch folgendes machen
          print '<?xml version="1.0" encoding="UTF-8"?>'."\n";

          oder wenn der Code länger ist

          define ('NL', "\n");  
          print '<?xml version="1.0" encoding="UTF-8"?>'.NL;  
          print '...'.NL;
          

          mfg
          Twilo

          1. Hallo Twilo.

            dann kann man aber noch folgendes machen
            (...)
            oder wenn der Code länger ist

            define ('NL', "\n");

            print '<?xml version="1.0" encoding="UTF-8"?>'.NL;
            print '...'.NL;

              
            Ich weiß, das habe ich bei einem Projekt verwendet, bei dem ich einfach zuviel hätte escapen müssen. Nur hatte ich eine Variable verwendet (warum auch immer), wo sich doch eine Konstante hier anbietet, wie du es geschrieben hast.  
              
            Who knows... :)  
              
              
            Gruß, Ashura  
            
            -- 
            Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|  
            Try it: [Become an Opera Lover in 30 days](http://tntluoma.com/opera/lover/7/)  
            Meine Browser: Opera 8.0 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0  
            IE Layout-Workaround №1: <!--[if IE]><style type="text/css">\*{display:none;}</style><![endif]-->
            
            1. Hallo Ashura,

              dann kann man aber noch folgendes machen
              (...)
              oder wenn der Code länger ist

              define ('NL', "\n");

              print '<?xml version="1.0" encoding="UTF-8"?>'.NL;
              print '...'.NL;

              
              >   
              > Ich weiß, das habe ich bei einem Projekt verwendet, bei dem ich einfach zuviel hätte escapen müssen. Nur hatte ich eine Variable verwendet (warum auch immer), wo sich doch eine Konstante hier anbietet, wie du es geschrieben hast.  
              >   
              > Who knows... :)  
                
              Es ist zwar sinnvoll, eine Konstante zu verwenden, aber von der Geschwindigkeit her ist es bestimmt besser das "\n" direkt hinzuschreiben.  
                
              Auf jeden Fall sind eure beiden Methoden [äußerst langsam](https://forum.selfhtml.org/?t=107547&m=668057), meine ist die schnellste... \*SCNR\*  
                
                
              Bis dann!  
                
              Marc Reichelt || <http://www.marcreichelt.de/>  
              
              -- 
              Linux is like a wigwam - no windows, no gates and an Apache inside!  
                
              Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)  
              <http://emmanuel.dammerer.at/selfcode.html>
              
              1. Hallo Marc.

                Es ist zwar sinnvoll, eine Konstante zu verwenden, aber von der Geschwindigkeit her ist es bestimmt besser das "\n" direkt hinzuschreiben.

                Stimmt schon, da der String dann direkt verarbeitet werden kann und nicht erst einen Umweg über eine Variable / Konstante machen muss, um sich zu vervollständigen.

                Auf jeden Fall sind eure beiden Methoden äußerst langsam, meine ist die schnellste... *SCNR*

                Angeber! ;)

                Gruß, Ashura

                --
                Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
                Try it: Become an Opera Lover in 30 days
                Meine Browser: Opera 8.0 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
                IE Layout-Workaround №1: <!--[if IE]><style type="text/css">*{display:none;}</style><![endif]-->
              2. echo $begrüßung;

                Es ist zwar sinnvoll, eine Konstante zu verwenden, aber von der Geschwindigkeit her ist es bestimmt besser das "\n" direkt hinzuschreiben.

                Leider weiß ich die Quelle nicht mehr, aber ich glaube gelesen zu haben, dass Konstanten bereits zur Kompilierzeit aufgelöst werden. Das obige sollte dann keine Auswirkungen mehr haben.

                echo "$verabschiedung $name";

            2. Hallo Ashura

              Ich weiß, das habe ich bei einem Projekt verwendet, bei dem ich einfach zuviel hätte escapen müssen. Nur hatte ich eine Variable verwendet (warum auch immer), wo sich doch eine Konstante hier anbietet, wie du es geschrieben hast.

              Who knows... :)

              Das Archiv, wer sonst.

              Freundliche Grüße

              Vinzenz

          2. Hi,

            define ('NL', "\n");

            print '<?xml version="1.0" encoding="UTF-8"?>'.NL;
            print '...'.NL;

              
            Außer der Optik beim Quellcode-betrachtenden Menschen hat der Zeilenumbruch hier keinerlei Bedeutung, kann also wegfallen.  
              
            cu,  
            Andreas
            
            -- 
            [Warum nennt sich Andreas hier MudGuard?](http://www.Mud-Guard.de/)  
            [Schreinerei Waechter](http://www.schreinerei-waechter.de/)  
              
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.  
            
            
      2. Hallo Twilo,

        folgende Zeile finde ich z.B. viel übersichlicher
        echo '<?xml version="1.0" encoding="UTF-8"?>';

        1. muss man dort die " nicht escapen
        2. ist diese Anweisung sogar ein paar Millisekunden schneller ;-)

        Wie Ashura schon gesagt hat, fehlt bei dir ein Zeichen für eine neue Zeile.
        Fragt sich nun, was schneller ist:

        echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
        oder
        echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";

        Mit der Übersichtlichkeit hast du Recht, die Geschwindigkeit müsste man mal automatisiert ermitteln lassen. Und das habe ich jetzt gerade auch mal machen lassen, folgendes Skript:

        <?php  
          
         // Performance-Test  
          
         header("Content-type: text/plain");  
         echo "Starte Geschwindigkeitstest...\n";  
          
         $times = 1000000;  
          
          
         // erster Durchlauf  
          
         $begintime = explode(" ", microtime());  
         $begintime = (float)$begintime[0] + (float)$begintime[1];  
          
         for($i=0; $i<$times; $i++)  
         {  
          echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n";  
         }  
          
         $endtime = explode(" ", microtime());  
         $endtime = (float)$endtime[0] + (float)$endtime[1];  
          
         $firsttime = $endtime - $begintime;  
          
          
         // zweiter Durchlauf  
          
         $begintime = explode(" ", microtime());  
         $begintime = (float)$begintime[0] + (float)$begintime[1];  
          
         for($i=0; $i<$times; $i++)  
         {  
          echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";  
         }  
          
         $endtime = explode(" ", microtime());  
         $endtime = (float)$endtime[0] + (float)$endtime[1];  
          
         $secondtime = $endtime - $begintime;  
          
          
          
         // Ausgabe  
          
         echo "Erster Durchlauf:  $firsttime Sekunden\n";  
         echo "Zweiter Durchlauf: $secondtime Sekunden\n";  
         echo "Prozentual (1/2):  ". $firsttime/$secondtime ."\n";  
          
        ?>
        

        Ich habe das Skript mehrfach laufen lassen, aber der Mittelwert des prozentualen Anteils bleibt größer als 1, was bedeutet dass die erste Methode (deine) länger braucht als meine:

        ---schnipp---
        marc@linux:~> for (( I=1; $I <= 10; I++ )); do  php speedtest.php | grep Prozentual; done
        Prozentual (1/2):  1.07741338453
        Prozentual (1/2):  1.06501519787
        Prozentual (1/2):  1.07005052912
        Prozentual (1/2):  1.06694041504
        Prozentual (1/2):  1.07399288338
        Prozentual (1/2):  1.0689044657
        Prozentual (1/2):  1.06863608119
        Prozentual (1/2):  0.98358096932
        Prozentual (1/2):  1.1488245319
        Prozentual (1/2):  1.06209438915
        marc@linux:~>
        ---schnapp---

        Damit wäre dein zweites Argument wiederlegt - das erste bleibt natürlich unumstritten! ;-)

        Bis dann!

        Marc Reichelt || http://www.marcreichelt.de/

        --
        Linux is like a wigwam - no windows, no gates and an Apache inside!
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
        http://emmanuel.dammerer.at/selfcode.html
        1. Hi Marc,

          Mit der Übersichtlichkeit hast du Recht, die Geschwindigkeit müsste man mal automatisiert ermitteln lassen. Und das habe ich jetzt gerade auch mal machen lassen, folgendes Skript:

          ---schnapp---

          ach, warum denn so kompliziert? ab2 existiert.

          benjamin@zaphod test $ cat test1.php
          <?php echo '<?xml version="1.0" encoding="UTF-8" ?>'; ?>
          benjamin@zaphod test $ cat test2.php
          <?php echo "<?xml version="1.0" encoding="UTF-8" ?>"; ?>

          Document Path:          /test/test1.php
          Document Length:        39 bytes

          Concurrency Level:      1
          Time taken for tests:   2.438691 seconds
          Complete requests:      1000
          Failed requests:        0
          Write errors:           0
          Total transferred:      262000 bytes
          HTML transferred:       39000 bytes
          Requests per second:    410.06 [#/sec] (mean)
          Time per request:       2.439 [ms] (mean)
          Time per request:       2.439 [ms] (mean, across all concurrent requests)
          Transfer rate:          104.56 [Kbytes/sec] received

          Document Path:          /test/test2.php
          Document Length:        39 bytes

          Concurrency Level:      1
          Time taken for tests:   2.407387 seconds
          Complete requests:      1000
          Failed requests:        0
          Write errors:           0
          Total transferred:      262000 bytes
          HTML transferred:       39000 bytes
          Requests per second:    415.39 [#/sec] (mean)
          Time per request:       2.407 [ms] (mean)
          Time per request:       2.407 [ms] (mean, across all concurrent requests)
          Transfer rate:          105.92 [Kbytes/sec] received

          Nichtsdestotrotz hast Du recht, die Doublequotes scheinen schneller zu sein. Warum auch immer.

          Viele Grüße
          Benjamin

        2. Hallo Marc

          folgende Zeile finde ich z.B. viel übersichlicher
          echo '<?xml version="1.0" encoding="UTF-8"?>';

          1. muss man dort die " nicht escapen
          2. ist diese Anweisung sogar ein paar Millisekunden schneller ;-)

          Wie Ashura schon gesagt hat, fehlt bei dir ein Zeichen für eine neue Zeile.
          Fragt sich nun, was schneller ist:

          Ich habe das Skript mehrfach laufen lassen, aber der Mittelwert des prozentualen Anteils bleibt größer als 1, was bedeutet dass die erste Methode (deine) länger braucht als meine:

          ---schnipp---
          marc@linux:~> for (( I=1; $I <= 10; I++ )); do  php speedtest.php | grep Prozentual; done
          Prozentual (1/2):  1.07741338453
          Prozentual (1/2):  1.06501519787

          [...]

          Damit wäre dein zweites Argument wiederlegt - das erste bleibt natürlich unumstritten! ;-)

          Naja, zur Widerlegung lies bitte http://forum.de.selfhtml.org/archiv/2003/8/t54141/#m301232.

          Und allein 1) reicht grundsätzlich dafür einfache Hochkomma zu verwenden, zitierter Thread unterstreicht dies noch.

          Freundliche Grüße

          Vinzenz

        3. Hi,

          Wie Ashura schon gesagt hat, fehlt bei dir ein Zeichen für eine neue Zeile.

          An dieser Stelle (Ausgabe der XML-Deklaration) wird aber kein Zeilenumbruch benötigt.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. Hallo MudGuard,

            Wie Ashura schon gesagt hat, fehlt bei dir ein Zeichen für eine neue Zeile.

            An dieser Stelle (Ausgabe der XML-Deklaration) wird aber kein Zeilenumbruch benötigt.

            Nein, wird er nicht. Aber man kann den Quelltext besser lesen wenn er gut formatiert ist.

            Die ganze Diskussion um die Geschwindigkeit kann man sich sowieso sparen, klar ist dass Variablen innerhalb von doppelten Anführungszeichen wesentlich langsamer interpretiert werden als wenn man sie außerhalb des Strings mittels einem Punkt verbindet.

            Bis dann!

            Marc Reichelt || http://www.marcreichelt.de/

            --
            Linux is like a wigwam - no windows, no gates and an Apache inside!
            Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
            http://emmanuel.dammerer.at/selfcode.html
        4. Wie Ashura schon gesagt hat, fehlt bei dir ein Zeichen für eine neue Zeile.
          Fragt sich nun, was schneller ist:

          auf jeden fall die zeile ohne newline.
          xml ist ein datenstrom. das erste was jeder xml-parser macht, ist alle white-spaces zu beseitigen.

          mit dem newline belastet du das system 2 mal.
          1. mal beim generieren des newline mit deinem programm
          2. mal beim entfernen des newline durch parser

          1. Hallo fanelf.de,

            Wie Ashura schon gesagt hat, fehlt bei dir ein Zeichen für eine neue Zeile.
            Fragt sich nun, was schneller ist:

            auf jeden fall die zeile ohne newline.
            xml ist ein datenstrom. das erste was jeder xml-parser macht, ist alle white-spaces zu beseitigen.

            mit dem newline belastet du das system 2 mal.

            1. mal beim generieren des newline mit deinem programm
            2. mal beim entfernen des newline durch parser

            Kontra: Dafür ist der Quelltext für einen Menschen wesentlich besser lesbar.
            Und das ist bei mir wichtiger als wenn zwei Computer eine Geschwindigkeit von auch nur einem Bruchteil einer Millisekunde verlieren.

            Bis dann!

            Marc Reichelt || http://www.marcreichelt.de/

            --
            Linux is like a wigwam - no windows, no gates and an Apache inside!
            Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
            http://emmanuel.dammerer.at/selfcode.html
          2. Wie Ashura schon gesagt hat, fehlt bei dir ein Zeichen für eine neue Zeile.
            Fragt sich nun, was schneller ist:

            auf jeden fall die zeile ohne newline.
            xml ist ein datenstrom. das erste was jeder xml-parser macht, ist alle white-spaces zu beseitigen.

            Das ist so falsch. Aus http://edition-w3c.de/TR/2000/REC-xml-20001006/#sec-white-space:

            Ein XML-Prozessor muss stets alle Zeichen in einem Dokument, die nicht zum Markup gehören, an die Anwendung weiterreichen. Ein validierender XML-Prozessor muss die Anwendung außerdem darüber informieren, welche Leerraumzeichen im Inhalt eines Elements stehen.

            Whitspaces werden also erstmal wie jedes andere Zeichen behandelt.

            1. Anonymous,

              Das ist so falsch. Aus http://edition-w3c.de/TR/2000/REC-xml-20001006/#sec-white-space:
              Ein XML-Prozessor muss stets alle Zeichen in einem Dokument, die nicht zum Markup gehören, an die Anwendung weiterreichen. Ein validierender XML-Prozessor muss die Anwendung außerdem darüber informieren, welche Leerraumzeichen im Inhalt eines Elements stehen.

              Whitspaces werden also erstmal wie jedes andere Zeichen behandelt.

              … andernfalls wäre auch das pre-Element ad absurdum geführt.
              Gunnar

              --
              “I got my finger on the trigger / But I don’t know who to trust” (Bruce Springsteen, Devils and Dust)
      3. echo $begrüßung;

        1. ist diese Anweisung sogar ein paar Millisekunden schneller ;-)

        Auf modernen Rechnern sind es nur Nanosekunden. Und wie der Test von Marc zeigt benötigt man schon eine Anzahl von Ausgaben in Größenordnungen von 10^5 bis 10^6 um langsam an spürbare Reaktionszeiten heran zu kommen.
        Das Argument, dass oder "" oder '' schneller ist, lässt sich zwar durch Messungen belegen ist aber praktisch in 99,9% der Fälle irrelevant. Und wenn es wirklich auf diese Nanosekunden ankommt - ich sehe da eher spürbarere Verbesserungsmöglichkeiten an anderen Stellen - sollte man lieber nachdenken, vielleicht etwas anderes als PHP zu verwenden.

        echo "$verabschiedung $name";

        1. twilo hat völlig recht. es geht ja nicht nur um die bruchteile von nanosekunken, sondern um die prinzipielle vorgehensweise.

          1. wenn ich einen text ausgeben möchte, schreibe ich den so wie er aussieht. ohne irgendwelche verwirrenden extrazeichen. schließlich ist der 1. gedanke eine übersichtliche programmierung.

          2. aus prinzip heraus belaste ich den interpreter nicht, wenn er nichts machen soll. daher schreibt man literale immer mit einfachen apostrophen und nicht mit gänsebeinchen. diese unsitte, variablen in gänsebeinchen-strings einzusetzen ist unnötig. man kann diese viel schöner und übersichtlicher verketten, und performance dabei sparen besonders in schleifen.

          1. echo $begrüßung;

            twilo hat völlig recht. es geht ja nicht nur um die bruchteile von nanosekunken, sondern um die prinzipielle vorgehensweise.

            Ich prangere ja nur eine gewisse Scheinheiligkeit an. Jemand hat gehört, dass irgendwas schneller sein soll als was anderes. Dass das in den meisten Fällen praktisch bedeutungslos ist, interessiert niemanden.

            Ich wette mit dir, dass du auch nicht konsequent Performance-Tests bis ins letzte Quentchen mit deinen Anwendungen durchführst und noch so manch schwerer wiegende Leiche als '' vs. "" im Keller liegen hast.

            1. aus prinzip heraus belaste ich den interpreter nicht,

            Das ist auch nicht konsequent. Warum programmierst du nicht gleich in Maschinensprache? :-)

            echo "$verabschiedung $name";

              1. aus prinzip heraus belaste ich den interpreter nicht,

              'unnötigerweise' hatte ich vergessen. oder: ich verplempere meine zeit nicht damit, konstukte zu finden, welche den interpreter zusätzlich belasten.

              damit meine ich, dass es länger dauert, eine gänsebeinchen-zeichenkette mit backslashes und $vars zu basteln, als wenn ich den string mit verkettunmg aufbaue.