Viennamade: Gültigkeitsbereich Variable

Hallo Forum!

Ich habe diese PHP-Seite:

<?php
$BuchTitel="WasserKochenLeichtGemacht";

function ZeigBuchTitel () {
 return $BuchTitel;
}
?>
<head>
</head>
<body>
<?php echo ZeigBuchTitel() . "Anzeige 1"; ?>
<?php echo $BuchTitel . "Anzeige 2"; ?>
</body>

Ich verstehe nicht, warum Anzeige 2 funktioniert, Anzeige 1 - die wäre mir sympathischer - aber nicht.
Danke!
Viennamade

  1. Holladiewaldfee,

    function ZeigBuchTitel () {
     return $BuchTitel;
    }

    Du weißt, daß Du hier grundsätzlich NULL zurück gibst, weil Du eine nicht definierte Variable verwendest?

    Ich verstehe nicht, warum Anzeige 2 funktioniert, Anzeige 1 - die wäre mir sympathischer - aber nicht.

    Aus obigem Grund: Weil Du mit echo nur den Wert einer nicht definierten Variable zurückgibst.

    Die Lösung für Dein Problem:

    global $BuchTitel;

    in der Funktion.

    Ciao,

    Harry

    --
      Herbst ist Wanderzeit!
      http://harry.ilo.de/projekte/berge/
    1. Hallo Harry,
      Zuerst mal Danke, mit global funktionert's. Trotzdem entäuscht mich die Antwort. Das bedeutet doch, daß globale Variablen nur 'mitten' im Code definiert werden können und wenn die Seiten länger werden (so ich jemals dazu imstande bin), dann wird es doch recht unübersichtlich. Ich denke zB. an eine Seite wo eine globale Variable den Namen einer Datenbank erhält und dann x Funktionen mit diesem Namen arbeiten.
      Gibt's im PHP keine Möglichkeit, globale Variablen an einer zentralen Stelle zu notieren ? - Oder ist mein Ansatz total falsch?
      Danke
      Viennamade

      1. Holladiewaldfee,

        Gibt's im PHP keine Möglichkeit, globale Variablen an einer zentralen Stelle zu notieren ? - Oder ist mein Ansatz total falsch?

        Jede Funktion hat ihre eigenen Variablen, mit Ausnahme der Super-Globalen-Variablen ($_REQUEST, $_POST usw.). Wenn Du in einer Funktion eine Variable aus dem globalen Scope haben willst, mußt Du sie importieren (global).

        Oder Du verwendest in der Funktion das Array $GLOBALS, mit dem Du ebenfalls Zugriff auf die globalen Variablen hast.

        Beispiel:

        ---
        $a = "blahr";

        function x()
        { echo '1: '.$a.'\n'; }

        function y()
        { global $a;
          echo '2: '.$a.'\n'; }

        function z()
        { echo '3: '.$GLOBALS['a'].'\n'; }

        x();
        y();
        z();
        ---

        Ausgabe:

        ---
        1:
        2: blahr
        3: blahr
        ---

        Diese Funkionalität ist sehr sinnvoll, das sieht man vor allem bei größeren Projekten, wenn man irgendwann einfach nicht mehr alle Variablen im Kopf hat oder mehrere Leute an einem Projekt arbeiten. Wenn da jeder frei Schnauze mit globalen Variablen rumspielen würde gäbe es ein heilloses Chaos.

        Ciao,

        Harry

        --
          Herbst ist Wanderzeit!
          http://harry.ilo.de/projekte/berge/
        1. Oder Du verwendest in der Funktion das Array $GLOBALS, mit dem Du ebenfalls Zugriff auf die globalen Variablen hast.

          Beispiel:
          $a = "blahr";
          function z()
          { echo '3: '.$GLOBALS['a'].'\n'; }

          Yep! Wow! Das brauchte ich!
          Danke!
          Viennamade

          1. Hello,

            Oder Du verwendest in der Funktion das Array $GLOBALS, mit dem Du ebenfalls Zugriff auf die globalen Variablen hast.

            Beispiel:
            $a = "blahr";
            function z()
            { echo '3: '.$GLOBALS['a'].'\n'; }

            Yep! Wow! Das brauchte ich!

            Das solltest Du nicht so machen. PHP bietet echt saubere Scopes für Funktionen, dann sollte man die Werte auch mittels Call-by-Value (also als Kopie der Variablen) als Funktionsattribut übergeben. Erst dann ist eine Funktion zur Hälfte richtig genutzt, da eine Entkoppelung der Namensbereiche entsteht.

            Vollständig richtig benutzt ist die Funktion, wenn sie auch ein Ergebnis liefert:

            <?php  #### scope.php ####

            function quadrat($wert)
            {
             # mach was mit dem wert
             $wert *= $wert;   ## das heißt: wert = wert * wert;
             # und gib das Ergebnis zurück
             return $wert;
            }

            Der Aufruf der Funktion erfolgt dann

            $eingabe = 7;
            echo "Eingabe vorher: $eingabe <br>";
            echo "Eingabe Quadrat: ".quadrat($eingabe)."<br>";
            echo "Eingabe hinterher: $eingabe <br>";

            ?>

            Wie Du siehst, wird $eingabe nicht verändert und da kannst Du innerhalb der Funktion machen was Du willst. Aber das Ergebnis stimmt trotzdem (hoffe ich doch). Und dabei musstet Du iinerhalb der Funktion bei der Erstellung noch nicht wissen, wie Deine äußere Variable mal heißen wird. das ist doch ein echter Vorteil!

            Liebe Grüße

            Tom

            1. Hallo Tom!
              Huch? Ich hab gestern den Film Cube (sehr kafkaesk) gesehen und jetzt bin ich mitten drinnen!
              Darf ich mal ohne Syntax aufschreiben was ich will?

              ---
              VAR=""
              function tel: select tel from VAR where ...
              function table: if querystring="1" then VAR="freunde" else VAR="firmen"

              <head></head>
              <body>
              <h1><?php echo "Anzeige Telefonnr. " . VAR <?php></h1>
              </body>
              ---
              $GLOBALS['VAR'] von Harry gefällt mir gut, ich sehe VAR sozusagen als Eigenschaft die durch Querystring gesetzt wird und auf der ganzen Seite im Zugriff ist. Dein Beispiel - ich sag mal gekapselte Funktion dazu - weiß ich nicht verwenden. Aber wahrscheinlich stehe ich auf der Leitung ... weiß erst seit vorgestern, daß man php-code mit <?php einleitet... Bin jedenfalls für jeden weiteren Tip dankbar.
              Viennamade

              1. Hello,

                ich kenne den Film Cube nicht. Was passiert denn da?

                Ich werde heute Abend nicht mehr antworten, weil das wohl ein laaaanger Thread werden muss, damit Du zu einem vernünftigen Ergebnis kommst und auch verstehst, wie das alles zusammenhängt.

                Aber morgen schauen wir uns das nochmal an. Vielleicht formulierst Du bis dahin ruhig nochmal alles ganz ausführlich im Klartext, also ohne Variablen, Selects etc. M´Nimm einfach die deutsche Sprache. So eine Funktionsbeschreibung hilft, das Ziel zu erreichen.

                Bis morgen dann

                Tom

                1. ich kenne den Film Cube nicht. Was passiert denn da?

                  Leute finden sich eines Tages in einem würfelförmigen, absolut leeren Raum wieder. Irgendwie sind sie dorthin gekommen, und suchen gemeinsam einen Weg aus dem Labyrinth, welches aus immer weiteren Würfeln besteht. Der Film ist nicht schlecht, aber nicht gut genug gemessen am Thema, habe mich nach dem Buch erkundigt, jedoch beruht er auf einem Schüleraufsatz!

                  Aber morgen schauen wir uns das nochmal an. Vielleicht formulierst Du bis dahin ruhig nochmal alles ganz ausführlich im Klartext, ...

                  Es geht um ein Redaktions-System für eine Hompage. Für Artikel sollen Beschreibungen, Bestellnummern, etc. in einer Datenbank erfaßt werden. Ein Mitarbeiterstamm (Name, Durchwahl und so für die Kontaktseite), eine Tabelle für technische Dokumentation.

                  Ich stelle mir 2 Seiten vor. Auf der ersten Seite stehen Verweise:
                  Bearbeiten Mitarbeiterstamm
                  Bearbeiten Artikelstamm
                  Bearbeiten Dokumentationsliste
                  Durch Klick auf einen Verweis soll Seite 2 aufgerufen werden und da denke ich müssen Variable gesetzt werden - in Abhängigkeit welcher Verweis geklickt wurde, dafür habe ich den Querystring verwendet.
                  ZB. eine Variable für Tabelle, vielleicht auch eine Array-Variable für die Spalten welche editiert werden dürfen. Auf diese Variable(n) soll - und das ist mein Problem - dann mit etlichen Funktionen zugegriffen werden, und zwar vor <head> wie auch nach <body> in php-Aufrufen.

                  Im Rohentwurf hatte ich die beiden Seiten bereits mehr oder weniger, wobei die 2. Seite ein wüstes Durcheinander von PHP und HTML war. Dann provozierte ich hier einen Thread und mir wurde klar, daß PHP und HTML getrennt gehören und ich begann die Seite umzuschreiben: Oben PHP, dann <html>. Und da bin ich jetzt :-)
                  Nur: Eine Template-Engine will ich vorderhand nicht verwenden, will das mal selbermachen um was zu lernen.

                  Ich werde heute Abend nicht mehr antworten, weil das wohl ein laaaanger Thread werden muss, damit Du zu einem vernünftigen Ergebnis kommst und auch verstehst, wie das alles zusammenhängt.

                  »»
                  Ich bin dabei! Weitermachen!
                  Liebe Grüße
                  Viennamade

                  1. Moin!

                    Nur: Eine Template-Engine will ich vorderhand nicht verwenden, will das mal selbermachen um was zu lernen.

                    Dann mach dir eine Template-Engine selber.

                    Da du schon eingesehen hast, dass es sinnvoll ist, vernünftig zu schreiben: Du mußt einfach deine Möglichkeiten besser ausnutzen.

                    Aus Funktionen heraus auf globale Variablen zuzugreifen ist ultraböse. Egal, ob das mit "global $var" oder "$GLOBALS['var']" geschieht: MAN MACHT ES NICHT! Es führt garantiert zu Problemen, weil du dann über alle verwendeten Dateien hinweg, über alle beteiligten Funktionen hinweg, garantieren mußt, dass keine Funktion irgendeinen globalen Variablennamen aus Versehen doppelt verwendet!

                    Da solch eine Übersicht nur besteht, wenn man nicht mehr als eine globale Variable verwendet (um es mal extrem auszudrücken), würdest du dir extreme Fehlerquellen einbauen.

                    Das, was du willst, ist ja im Prinzip schon gut: Oben Informationen sammeln, unten ausgeben.

                    Dazu solltest du dann aber "einfach" die "richtigen" Methoden anwenden.

                    ---schnipp---
                    <?php
                    $BuchTitel="WasserKochenLeichtGemacht";

                    function ZeigBuchTitel () {
                     return $BuchTitel;
                    }
                    ?>
                    <head>
                    </head>
                    <body>
                    <?php echo ZeigBuchTitel() . "Anzeige 1"; ?>
                    <?php echo $BuchTitel . "Anzeige 2"; ?>
                    </body>
                    ---schnapp---

                    Das Problem bei deinem Code hier: Du definierst eine globale Variable. Das gibt die Aussicht auf mehr. Denn du brauchst ja nicht nur $Buchtitel, sondern auch $BuchISBN_Nummer, $BuchBeschreibung, $BuchPreis, $BuchRating und $BuchCoverBild.

                    Sowas in globale Variablen zu packen ist ungeschickt. Besser: Fasse deine fürs Template bestimmten Informationen in einem Array zusammen.

                    $template['buchtitel']="WasserKockenLeichtGemacht";
                    ...

                    <?php echo $template['buchtitel']; ?>

                    Mit diesem Array kannst du dann auch Funktionen beliefern bzw. Funktionsergebnisse in das Array reinspeichern. Du weißt aufgrund des Arraynamens sofort, dass es sich um Daten fürs Template handelt, und du weißt aufgrund des Arrayindices, welche Information es sein soll. Irgendwo im Template wird der Wert dann verarbeitet werden.

                    - Sven Rautenberg

                    --
                    "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
                    (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
                    1. Hallo!
                      Danke für die Hilfe, ganz versteh' ich es noch nicht und das will ich anhand eines Beispiels loswerden.
                      Das Beispiel erzeugt mittels einer Template eine HTML-Überschrift und das funktioniert so weit auch.
                      Was ich nicht verstehe: Wenn die Seite einmal ausgewachsen ist, dann wird $template["modus"] oben im Template-Bereich ja x-mal verwendet werden. Das bedeutet - nach meinem derzeitigen Wissenstand - daß ich immer wieder vom HTML-Bereich $HTTP_SERVER_VARS aus in den PHP-Bereich schicken muß, und, daß fnModus immer wieder durchlaufen wird (Performance). Geht das nicht eleganter ohne Verlust an Klarheit?
                      Danke
                      Viennamade

                      <?php
                      $template["modus"] ="";
                      function doHeader ($querystring) {
                       if (fnModus($querystring) == 'CRE') {
                        $template["modus"]="Datenbank anlegen";
                        }
                       elseif (modus($querystring) == 'DEL') {
                        $template["modus"]="Datenbank löschen";
                        }
                       return $template["modus"];
                       }
                      function fnModus ($querystring) {
                       $a = explode('&', $querystring);
                       $i = 0;
                       while ($i < count($a)) {
                        $b = split('=', $a[$i]);
                        $i++;
                       }
                       return $b[1];
                      }
                      ?>

                      <head>
                      </head>
                      <body>
                      <h1><?php echo doHeader($HTTP_SERVER_VARS["QUERY_STRING"]); ?></h1>
                      </body>
                      </html>

                      1. Moin!

                        Das Beispiel erzeugt mittels einer Template eine HTML-Überschrift und das funktioniert so weit auch.

                        Es funktioniert, aber es ist vom Funktionsprinzip her falsch angewandt.

                        Deine Aufgabe ist es, im PHP-Teil alle relevanten Ausgaben, die du im HTML-Teil ausgeben willst, zusammenzustellen.

                        Gehen wir mal vom Template aus: Dort sollte eigentlich _ausschließlich_ sowas drinstehen: <?php echo $variable; ?> Jedenfalls überall dort, wo variabler Text auszugeben ist.

                        Wie kleinkariert oder umfangreich deine einzufüllenden Textstücke werden, ist grundsätzlich deine Entscheidung - aber mehr als bereitgestellte Inhalte in umgebenden HTML-Code einzufügen hat ein Template nicht zu tun.

                        Es ist also nichts gegen
                        <html>
                        <head>
                        <metas, title, style>
                        </head>
                        <body>
                        <?php echo $full_content; ?>
                        </body>
                        </html>
                        einzuwenden, wenn es dir denn hilft und du derartig große Informationseinheiten vorliegen hast. Sollte ein Redakteur, gestützt beispielsweise durch eine Formatierungshilfe wie BB-Code, wirklich den gesamten Seitentext eingegeben (und sich dabei tatsächlich an alle Designrichtlinien etc. gehalten) haben, dann hast du tatsächlich "die komplette Seite - minus die Header" in der Datenbank (oder wo auch immer) vorliegen und mußt die einsetzen.

                        Wenn du einen Webshop hast und die einzelnen Artikelinformationen verarbeiten willst, mußt du natürlich kleiner vorgehen.

                        Weil es sich für Templates als schlau erwiesen hat, dass man in ihnen gewisse, _geringe_ Dynamik realisieren kann, gibt es die Möglichkeit, auf die dem Template übergebenen Daten zu reagieren.

                        Ein typisches Beispiel: IF-Abfragen. Wenn ein Feld ausgefüllt ist, soll es <h1><?php echo $titel; ?></h1> ausgegeben werden, wenn nicht, soll kein leeres <h1></h1> ausgegeben werden, sondern entweder gar nichts, oder <h1>Kein Titel</h1>.

                        Sowas kann man gut (oder besser, als im PHP-Code) im Template regeln.

                        Was auch nett ist: Schleifenfunktionalität, um Tabellen auszugeben. Dazu wird dem Template nicht eine Einzelvariable übergeben, sondern gleich ein ganzes Array, welches in einer Tabelle ausgegeben wird. Dazu wird ein gewisser Teil des Templates als "Wiederholung für jedes Element des Arrays" gekennzeichnet.

                        PHP ist als Templateengine entstanden. Und es ist irgendwie logisch: Wenn man IF-Entscheidungen treffen kann und Schleifen bauen darf, hat man im Prinzip eine Programmiersprache. Fehlen dann nur noch Funktionsdefinitionsmöglichkeiten etc, und schon hat man PHP in der heutigen Version.

                        Nun gut: Du weißt jetzt, was du dem Template schicken sollst: Einfache Variablen, die nichts weiter enthalten als Text.

                        Und genau deshalb sind Konstrukte wie dieses hier:

                        <body>
                        <h1><?php echo doHeader($HTTP_SERVER_VARS["QUERY_STRING"]); ?></h1>
                        </body>

                        schlecht. Du gibst nicht den Inhalt einer bearbeiteten, bereitgestellten Variablen aus, sondern nutzt direkt vom User angegebene Daten (der QUERY_STRING ist sowas) dafür, eine Funktion aufzurufen.

                        Dein Beispiel sollte so lauten:

                        Im oberen Teil:
                        $template['titel'] = doHeader($_SERVER['QUERY_STRING']);

                        Und im Template dann nur noch:
                        <h1><?php echo $template['titel']; ?></h1>

                        Vorteil für dich:

                        1. Beim Schreiben des Templates konzentrierst du dich auf gutes HTML. Um ein umzusetzendes Design überhaupt erstmal in HTML zu bekommen, schreibt man üblicherweise ganz stinknormales, PHP-freies HTML mit Platzhaltertexten. Diese Vorlage wird dann genommen, und an verschiedenen Stellen werden die Platzhalter durch Template-Code, welcher die dynamischen Inhalte reinschreibt, ersetzt.

                        Du weißt also nach dem Schreiben der obigen HTML-Templatezeile: Aha, hier kommt der Titel rein. Das ist für die Übersicht im Template toll.

                        2. Du kannst dich beim Programmieren des PHP-Teils auf die zu bearbeitende Textinformation konzentrieren. Du kannst also überlegen: Hm, irgendwie brauche ich einen je nach Aktion aussagefähigen Titel. Wie erzeuge ich den? Steht der in der Datenbank, oder kriege ich den basierend auf irgendwelchen Benutzeraktionen, oder woher sonst? Und das Ergebnis dieser Überlegung und Programmierung kommt dann - logisch - in die Variablen die du in allen Templates als Titel verwendest: $template['titel'].

                        Und das tolle daran ist: Du kannst im Template $template['titel'] dann eben auch problemlos mehrfach verwenden:

                        <head><title>Aktion: <?php echo $template['titel']; ?></title></head>
                        <body><h1><?php echo $template['titel']; ?></h1>
                        <p>....

                        Würdest du da immer einen Funktionsaufruf machen, wäre das unnötige Verschwendung von Rechenzeit, weil Arbeit doppelt getan werden muß, die man genausogut einmal erledigt hätte.

                        Was ich nicht verstehe: Wenn die Seite einmal ausgewachsen ist, dann wird $template["modus"] oben im Template-Bereich ja x-mal verwendet werden. Das bedeutet - nach meinem derzeitigen Wissenstand - daß ich immer wieder vom HTML-Bereich $HTTP_SERVER_VARS aus in den PHP-Bereich schicken muß, und, daß fnModus immer wieder durchlaufen wird (Performance). Geht das nicht eleganter ohne Verlust an Klarheit?

                        Jetzt klarer?

                        Noch ein Vorteil mit deinen Templates: Natürlich programmierst du deine Templates je Anwendungszweck passend zu den jeweiligen PHP-Codes. Aber es wäre beispielsweise kein Problem, ein und dieselbe Information auf einer Seite durch mehrere gleiche Templates, die sich nur in der Darstellung unterscheiden, je nach Userwunsch auszugeben.

                        Wenn du den HTML-Abschnitt unten an jedem Skript abschneidest, in eine eigene Datei speicherst und diese neue Datei dann im Skript mit include() einbindest, dann hast du schon mal eigenständige Template-Dateien. Die funktionieren noch immer genauso, wie dein zusammenhängendes Skript, aber sie lassen sich in einem HTML-Editor fast als eigenständige HTML-Dateien bearbeiten.

                        Und wenn du die Templates alle in ein eigenes Verzeichnis packst und das "typ1" nennst, und eine zweite Serie von Templates, die dieselben Dateinamen haben und dieselben Variablen ausgeben, aber HTML-mäßig anders aussehen, in ein Verzeichnis "typ2" packst (und das bei Bedarf noch einige Male mehr machst), hast du schon ein universell verwendbares System, um deiner PHP-Anwendung unterschiedliche "Skins" zu verpassen. Klar, mit CSS allein ginge das in gewissem Rahmen auch, aber wenn du unterschiedliche, feste Bilder einbinden wolltest, wäre schon Schluß damit.

                        include frißt übrigens nicht nur feste Strings (include "verzeichnis/datei.php"), sondern auch variable Strings als Argument (include $typ."/datei.php").

                        - Sven Rautenberg

                        --
                        "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
                        (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
                        1. Hallo Sven!

                          Mühsam ernährt sich das Eichhörnchen, aber Nahrung gibt Dein Mail ja genug!

                          Was ich nicht verstehe: ...

                          Jetzt klarer?

                          Definitiv: Ja.
                          Ich hab im body-Bereich vom Template jetzt 5 Zeilen zusammengebracht, die im Sinne Deiner Darstellung sind.

                          Weil es sich für Templates als schlau erwiesen hat, dass man in ihnen gewisse, _geringe_ Dynamik realisieren kann, ...

                          ... und an so eine Tabelle gehts morgen!

                          DANKE
                          Viennamade

  2. <?php echo ZeigBuchTitel() . "Anzeige 1"; ?>
    <?php echo $BuchTitel . "Anzeige 2"; ?>

    Im echo kann wohl keine Funktion enthalten sein. Wie wäre es mit

    $txt = ZeigBuchTitel();
    <?php echo $txt." Anzeige 1"; ?>

    MfG, Kalle

    1. Holladiewaldfee,

      <?php echo $BuchTitel . "Anzeige 2"; ?>

      Im echo kann wohl keine Funktion enthalten sein. Wie wäre es mit

      Bitte, wenn Du keine Ahnung hast: Laß es!

      Ciao,

      Harry

      --
        Herbst ist Wanderzeit!
        http://harry.ilo.de/projekte/berge/
      1. Hello Harry,

        <?php echo $BuchTitel . "Anzeige 2"; ?>

        Im echo kann wohl keine Funktion enthalten sein. Wie wäre es mit

        Bitte, wenn Du keine Ahnung hast: Laß es!

        Das ist aber nicht nett. Seine Vermutungen äußern kann doch jeder hier, oder? Und manche wissen sogar, woran es liegt *gg*

        Aber jeder kann mal daneben tippen oder einen Knoten in den Gedanken haben.

        Grüße

        Tom

        1. Holladiewaldfee,

          Das ist aber nicht nett. Seine Vermutungen äußern kann doch jeder hier, oder? Und manche wissen sogar, woran es liegt *gg*

          Nein, sicher war das nicht nett.
          Aber sorry, wer zu solch banalen Fragen einen dermaßenen Unsinn verzapft, sollte es lieber sein lassen. Das hätte ich vielleicht auch etwas freundlicher sagen können, zugegebenermaßen.

          Aber jeder kann mal daneben tippen oder einen Knoten in den Gedanken haben.

          Das war dann aber ein deftiger Knoten ;)

          Ciao,

          Harry

          --
            Herbst ist Wanderzeit!
            http://harry.ilo.de/projekte/berge/
  3. Hello,

    <?php
    $BuchTitel="WasserKochenLeichtGemacht";

    function ZeigBuchTitel ($titel) {
      return $titel;

    }
    ?>
    <head>
    </head>
    <body>

    <?php echo ZeigBuchTitel($BuchTitel) . "Anzeige 1"; ?>

    <?php echo $BuchTitel . "Anzeige 2"; ?>
    </body>

    Und was passiert jetzt?

    Grüße

    Tom

    1. function ZeigBuchTitel ($titel) {
        return $titel;

      }
      Und was passiert jetzt?

      Hallo Tom,
      stimmt, die Lösung funktionert. Gefällt mir aber nicht so gut, weil da eine zusätzliche Variablenübergabe stattfindet. Die Lösung von Harry - ob nett oder nicht :-) - [pref:m=373238&t=65574] erscheint mir am sinnvollsten.
      Danke!
      Viennamade

      1. Hello,

        stimmt, die Lösung funktionert. Gefällt mir aber nicht so gut, weil da eine zusätzliche Variablenübergabe stattfindet. Die Lösung von Harry - ob nett oder nicht :-) - [pref:m=373238&t=65574] erscheint mir am sinnvollsten.

        Ich will Harry nicht zu nahe treten, aber das, was er gemacht hat, nennt man auch Einwegkot[tm] ;-) und der gehört in den Eimer.
        Programmsequenzen, die man nicht leicht wiederverwenden kann, oder die nicht reentrant sind, waren leider im "guten alten DOS" eine Menge drin. Deshalb konnte das nicht einfach weiterentwickelt werden. Ich blaube zwar, dass das Absicht war, aber mimms bitte als Gerücht.

        Dazu lies Dir bitte die Erklärung unter [pref:t=65574&m=373252] durch.

        Liebe Grüße

        Tom

        1. Holladiewaldfee,

          Ich will Harry nicht zu nahe treten, aber das, was er gemacht hat, nennt man auch Einwegkot[tm] ;-) und der gehört in den Eimer.

          Buh, Du bist raus! Morgen um 7 an Bios Eiche! ;)

          Programmsequenzen, die man nicht leicht wiederverwenden kann, oder die nicht reentrant sind ...

          Sicher ist der (=mein) Code Müll. Ich hatte allerdings den Eindruck, er wolle bewußt auf globale Variablen zugreifen. Die Lösung mit der Variablenübergabe ist prinzipiell natürlich die sauberste.

          (He, man könnte doch auch mit eval ... *g*) (Schmarn)

          Ciao,

          Harry

          --
            Herbst ist Wanderzeit!
            http://harry.ilo.de/projekte/berge/
          1. Hello,

            Sicher ist der (=mein) Code Müll. Ich hatte allerdings den Eindruck, er wolle bewußt auf globale Variablen zugreifen. Die Lösung mit der Variablenübergabe ist prinzipiell natürlich die sauberste.

            Na, aber er/sie ist darauf abgefahren auf diese antiquierte Idee aus CP/M-Zeiten. Da gab es nur ein Segment und es war so ziemlich wichtig, keinen Platz zu verschenken. Man hat eben auf jeden Wert direkt zugegriffen. Rekursion war undenkbar.

            (He, man könnte doch auch mit eval ... *g*) (Schmarn)

            Ja, könnte man auch. Setze ich seit längerem intensiv ein und so langsam habe ich auch ein Gefühl dafür bekommen, wie es sicher funktioniert. Man muss den eval()-Aufruf nur in eine Template-Hüllfunktion packen. Dann ist alles im grünen Bereich.

            function show_record($record[],&$daisychain[])
            ...
              lade Eval-String
              eval($record["show"])
            ...
              Verändere DaisyChain
            ...
              return obs geklappt hat.
            endOfFunction

            Selbstverständlich kann eval() auf alle Super-Globalen Variablen des Scriptes zugreifen. Eval kann auch auf das Dateisystem zugreifen. Eval kann SQL-Queries ausführen, eval kann...

            Also sollte man deshalb niemals eine externe Quelle mit eval() auswerten.

            Eval ist der Zwischenschritt von klassischer Top-Down-Prgrammierung zur _echten_ OOP, die PHP ja mangels Scopes nicht kann.

            Grüße

            Tom