Enrico: Mir nicht bekannte Notationsstruktur

(Fast) Mahlzeit,

beim Durchstöbern des world wide webs bin ich auf folgendes interessante php-Skript gestossen, das generierte php-Seiten als html-Seiten in einem eigenen Cache ablegt und beim erneuten Aufruf auch aus diesem holt und neue hinzufügt:

<?php

// Dateiname ohne Endung "php" extrahieren
        $filename = basename ($PHP_SELF,"php");

if (file_exists ("my_cache/" . $filename . "html"))
        {
           header ("Location:my_cache/" . $filename . "html");
        }
        else
        {

ob_start();
     ?>

<html>
        <body>
           hier liegen jede Menge Datenbankabfragen etc.
        </body>
     </html>

<?php

//der Inhalt des Puffers wird in $content abgelegt
        $content=ob_get_contents();

//eine Datei mit dem Namen "$filename.cache" wird im Cacheverzeichnis angelegt
        $fh=fopen ("my_cache/".$filename."cache", "w");

//der Pufferinhalt wird in diese Datei geschrieben
        fputs ( $fh, $content);

fclose($fh);

//die Datei wird auf ihren endgültigen Namen (Endung "html") umbenannt:
        rename ("my_cache/".$filename."cache", "my_cache/".$filename."html");

ob_end_flush ();
     }

?>

Ob's funktioniert oder nicht, kann ich nicht sagen, weil ich das Skript noch nicht ausprobiert habe.

Was mich aber wundert, ist die Struktur, da der "else"-Zweig zwar im ersten php-Abschnitt geöffnet, aber erst am Ende des zweiten php-Abschnitts wieder geschlossen wird, dazwischen steht (formalhalber) ganz normaler html-Code.

Ist dies eine gängige Notation oder irgendeine Besonderheit?
Welchen Sinn hat sie?

Gruß
Enrico

  1. Hi!

    Was mich aber wundert, ist die Struktur, da der "else"-Zweig zwar im ersten php-Abschnitt geöffnet, aber erst am Ende des zweiten php-Abschnitts wieder geschlossen wird, dazwischen steht (formalhalber) ganz normaler html-Code.
    Ist dies eine gängige Notation oder irgendeine Besonderheit?

    Ja, ganz normal.

    Welchen Sinn hat sie?

    Dass alles, was im if- oder else-Block steht, bedingt abgearbeitet wird, weißt du sicher schon. Dazu zählt dann auch das, was zwischen PHP-Blöcken steht. Alternativ könnte man das auch mit echo ausgeben, muss dann aber die PHP-Syntax berücksichtigen, also Anführungszeichen maskieren etc.

    Weiterhin ist dieses Vorgehen hilfreich beim Arbeiten mit Editoren, die HTML-Syntax unterstützen, beispielsweise für automatische Code-Vervollständigung. In einem PHP-String wird in der Regel kein HTML erkannt, also fehlt da auch die Editor-Unterstützung dafür. Für kleine HTML-Schnipsel lohnt sich das Vorgehen jedoch meist nicht.

    Lo!

    1. Hallo dedlfix,

      Dass alles, was im if- oder else-Block steht, bedingt abgearbeitet wird, weißt du sicher schon

      Ja, das wusste ich, ich habe mich nur über die Art der Notierung gewundert, weil hiermit php- und html-Code ohne "echo"-Befehle quasi vermischt wurde, und dass das möglich ist, war mir neu.

      Hat natürlich zwei riesen Vorteile:

      Zum Einen muß man sich, wie Du schon geschrieben hast, nicht um Maskierungen kümmern, zum Anderen bleibt die html-Sruktur übersichtlich.

      Danke für Deine Antwort und (mit an Sicherheit grenzender Wahrscheinlichkeit) bis zu meiner nächsten Frage ;-)

      Gruß
      Enrico

      1. Hey Enrico,

        falls es Dich in diesem Zusammenhang noch interessiert: Bei einem Beispiel wie Deinem vorherigen verwendet häufig auch noch eine andere Notation, um es etwas übersichtlicher zu gestalten:

          
        <?php  
          
        if ($foo):  
           echo "";  
        elseif ($bar):  
           echo "";  
        else:  
           echo "";  
        endif;  
        
        

        Gruß, Dennis

        1. Hey Dennis,

          ist auch ein guter Ansatz, wobei man hier natürlich wieder auf die Maskierungen achten muss.

          Gruß,
          Enrico

          1. Hey Enrico,

            sorry, hab mich etwas falsch ausgedrückt. Ich meinte sowas:

            <?php

            if ($foo):

            ?>

            <!-- Hier steht jetzt HTML -->

            <?php

            else:

            ?>

            <!-- Hier steht HTML-Code der else-Verzweigung -->

            <?php

            endif;

            ?>

            Das hat den Vorteil, dass in vielen Fällen so etwas wie endif übersichlicher ist als eine alleinstehende geschweifte Klammer.

            Gruß, Dennis

            1. Hey Dennis,

              <?php

              if ($foo):

              ?>

              <!-- Hier steht jetzt HTML -->

              <?php

              else:

              ?>

              <!-- Hier steht HTML-Code der else-Verzweigung -->

              <?php

              endif;

              ?>

              Wirklich interesant, wenn man dies übersichtlich kombinieren kann.

              Ich bin mir aber nicht sicher, ob es, v.a. bei Homepages mit vielen Links sinnvoll ist, dieses Konstrukt zu verwenden, da man aber auch leicht den Überblick verlieren könnte.

              Und schon haben wir wieder etwas dazu gelernt :-)

              Vielleicht kann ich diese Struktur ja brauchen.

              Auf jeden Fall wäre das mit dem Caching-System, wenn's funktioniert, schon eine feine Sache, auch unter Berücksichtigung der mir nun bekannteren Notierung.

              Gruß
              Enrico

              1. Ich bin mir aber nicht sicher, ob es, v.a. bei Homepages mit vielen Links sinnvoll ist, dieses Konstrukt zu verwenden, da man aber auch leicht den Überblick verlieren könnte.

                Ich weiß zwar nicht, was das mit Links zu tun hat; aber mit der Übersichtlichkeit hast Du recht. Besser wäre natürlich eine (weitestgehende) Trennung von Anwendungslogik und HTML-Ausgabe.

                Gruß, Dennis

                1. Hallo Dennis,

                  Ich weiß zwar nicht, was das mit Links zu tun hat

                  Ganz einfach:

                  Viele Links bedeuten, auf diese Struktur umgemünzt, umfangreiche if-else-Abfragen oder einen großen "switch".

                  Besser wäre natürlich eine (weitestgehende) Trennung von Anwendungslogik und HTML-Ausgabe

                  Ganz genau, auch aus Gründen der Wartungsfreundlichkeit und Fehlersuche.

                  Gruß
                  Enrico

                  1. Hi!

                    Viele Links bedeuten, auf diese Struktur umgemünzt, umfangreiche if-else-Abfragen oder einen großen "switch".

                    Viele X bedeuten das Nachdenken über Automatismen, wie Arrays, Schleifen, Funktionen, ...

                    Lo!

        2. Hi!

          Bei einem Beispiel wie Deinem vorherigen verwendet häufig auch noch eine andere Notation, um es etwas übersichtlicher zu gestalten:

          <?php

          if ($foo):
             echo "";
          elseif ($bar):
             echo "";
          else:
             echo "";
          endif;

            
          Oder mit ohne echo:  
            
          ~~~php
          <?php if ($foo): ?>  
            <p>foo</p>  
          <php elseif ($bar): ?>  
            <p>bar</p>  
          <?php else: ?>  
            <p>else</p>  
          <?php endif;?>
          

          Lo!

          1. Hey dedlfix,

            wie in meinem letzten Beitrag beschrieben meinte ich das auch so, war nur zu dämlich das auch hinzuschreiben.

            Gruß, Dennis

      2. Hi!

        [...] ich habe mich nur über die Art der Notierung gewundert, weil hiermit php- und html-Code ohne "echo"-Befehle quasi vermischt wurde, und dass das möglich ist, war mir neu.

        So neu sollte es dir nicht sein, denn dass PHP-Code in HTML eingebettet wird, ist _das_ Merkmal von PHP. Dass dabei die Anweisungen in den einzelnen PHP-Blöcken nicht einzeln sondern als Ganzes betrachtet werden müssen, weißt du vermutlich auch. Das besondere hierbei war "nur", dass auch Kontrollstrukturen auf mehrere Blöcke aufgeteilt werden können. Das geht auch mit Funktionen (inklusive variablen Werten):

        <?php  
        // ...  
          
        function htmlHead($title) { ?>  
        <head>  
          <title><?php echo htmlspecialchars($title) ?></title>  
        </head>  
        <?php }  
          
        // ...  
          
        htmlHead('Test');  
          
        ?>  
        
        

        Lo!

  2. Moin!

    Ist dies eine gängige Notation oder irgendeine Besonderheit?
    Welchen Sinn hat sie?

    Gängig: Ja.
    Sinnvoll: Nein.

    Nur scheinbar wird das serverseitige Erstellen von Webcontent dadurch vereinfacht. Besser wäre eine Trennung von Daten, Programmen, Ergebnisdarstellung und Layout. Diese wird hierdurch verhindert.

    Noch etwas zum Skript:

    Das Skript erzeugt - ohne Rücksicht auf Parameter und Veränderungen in den Daten - eine statische Version einer HTML-Seite und weist den Useragent an, diese andere Ressource abzuholen. Das führt schon mal den Grundgedanke des Erzeugens dynamischer Inhalte ad absurdum. Hinzu kommt die mit allem Verlaub dämliche Umleitung, die zu einer Verdoppelung der Requests führt. Wenn statt

    header ("Location:my_cache/" . $filename . "html");

    wenigstens

    readfile ("my_cache/" . $filename . "html"); exit;

    da stände, dann könnte ich noch darüber lachen. So sage ich Dir: Das Skript ist schlicht Schrott und gehört geschreddert. Es beschleunigt gar nichts und macht eine Menge Arbeit und eine Menge kaputt. Nimm Dir davon nichts zum Vorbild.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Hallo fastix,

      Gängig: Ja.
      Sinnvoll: Nein.
      Hinzu kommt die mit allem Verlaub dämliche Umleitung, die zu einer Verdoppelung der Requests führt

      Ok, sehr konträre Meinung.

      Warum wird es denn dann als (relativ) gängige Sytstematik (?) verwendet, wenn es sinnlos ist?

      Das macht dann wohl nur bei statischen Dateien Sinn, wobei da auch wiederum nicht, weil die ja eh im Cache liegen.

      Ok, dann macht das Skript in seiner Gesamtheit wohl wirklich keinen Sinn bzw. möglicherweise erst dann nur sehr marginal, wenn sämtliche dynamischen Möglichkeiten erzeugt und im Cache liegen.

      Sehr marginal deshalb, denn dann hätte der Besucher (m/w) ja schon alle Seiten durchlaufen und würde dann etwas merken, wenn der Besucher (m/w) eine bereits besuchte Seite nochmals aufrufen würde.

      Wobei dann wäre dieses Skript ja für krankhaft Vergessliche/Vergessende doch sinnvoll ;-)

      Das Skript ist schlicht Schrott und gehört geschreddert

      Hmmm, da hast Du wohl recht.

      Schade, es las sich eigentlich sehr hilfreich durch.

      Gut, dass hier viele Profis unterwegs sind, die hier mehr Ahnung haben als andere :-)

      Sonst würde man ja aber auch nichts lernen können.

      Gruß
      Enrico

      1. Moin!

        Warum wird es denn dann als (relativ) gängige Sytstematik (?) verwendet, wenn es sinnlos ist?

        Das hat damit zu tun, dass PHP ursprünglich mal als eine Art(!) Templatesystem oder Formulardateninterpreter angefangen hat, aber recht schnell zu einer ziemlich ausgeweiteten Programmiersprache wurde. Ähnliches lässt sich jetzt, wenn man es abstrakt genug betrachtet, bei dem Templatesystem Smarty erkennen.

        Die von Dir beschriebene Syntax mit der Einbettung in HTML ist eine der Ursachen, warum das Akronym "PHP" von manchem als "pupertierende Hauptschüler programmieren" übersetzt wird- wofür es einerseits genug Gründe und andererseits keinen Grund gibt. Diskutieren kann man das in beide Richtungen.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix