Marko: require_once()-Variablen auch innerhalb von Funktionen nutzen

Hallo,

Ich habe eine PHP-Datei, in der ich eine Menge Variablen definiert habe. Diese binde ich in eine andere PHP-Datei ein. Auf die Variabeln kann ich zugreifen, aber nur ausserhalb einer Funktion. Gibt es einen Weg, auf diese zuzugreifen, ohne sie in jeder einzelnen Funktion einzubinden (was eigentlich ziemlich sinnlos ist)?

Wenn nicht, welche andere Möglichkeit bietet sich mir an, "globale" Variabeln und PHP-Projekte mit mehreren Dateien zu machen? Alles in eine Datei murksen ist mir zu unübersichtlich.

Grüße, Marko

  1. Hallo,

    Ich habe eine PHP-Datei, in der ich eine Menge Variablen definiert habe. Diese binde ich in eine andere PHP-Datei ein. Auf die Variabeln kann ich zugreifen, aber nur ausserhalb einer Funktion. Gibt es einen Weg, auf diese zuzugreifen, ohne sie in jeder einzelnen Funktion einzubinden (was eigentlich ziemlich sinnlos ist)?

    Du kannst variablen als Global definieren.
    PHP_Mnual hilft Dir mit Sicherheit.

    Übrigens ist dies nicht sinnlos.
    Im Gegenteil!
    Mal ein bischen nachdenken warum dies wohl so ist?
    Kleine Denkanstöße:
    Große Projekte, viele Variablen, viel includes, fehlende Übersicht, unnötiger Speicherplatzverbrauch?

    Viele Grüße TomIRL

    1. Hi,

      Ich habe eine PHP-Datei, in der ich eine Menge Variablen definiert habe. Diese binde ich in eine andere PHP-Datei ein. Auf die Variabeln kann ich zugreifen, aber nur ausserhalb einer Funktion. Gibt es einen Weg, auf diese zuzugreifen, ohne sie in jeder einzelnen Funktion einzubinden (was eigentlich ziemlich sinnlos ist)?

      Du kannst variablen als Global definieren.
      PHP_Mnual hilft Dir mit Sicherheit.

      Sicher? Auch in PHP4? Ich werd mal suchen gehen...

      Übrigens ist dies nicht sinnlos.
      Im Gegenteil!
      Mal ein bischen nachdenken warum dies wohl so ist?
      Kleine Denkanstöße:
      Große Projekte, viele Variablen, viel includes, fehlende Übersicht, unnötiger Speicherplatzverbrauch?

      Hab ein Gegenargument:
      Wenn ich 20 Variabeln hab, und die in jede Funktion, die eine davon braucht, einbinde, include ich alle Variabeln bestimmt viel mal mehr, als wenn ich sie einmal einbinde, und der Inhalt dann überall verfügbar ist.

      Gruß, Marko

      1. Hello,

        Hab ein Gegenargument:
        Wenn ich 20 Variabeln hab, und die in jede Funktion, die eine davon braucht, einbinde, include ich alle Variabeln bestimmt viel mal mehr, als wenn ich sie einmal einbinde, und der Inhalt dann überall verfügbar ist.

        Du bist und bleibst beratungsresistent Aber das ist gesundheitsschädlich.

        In PHP4 kann man (denke ich) noch keine Childprozesse erzeugen, aber man kann rekursive Funktionen aufbauen. Das musst Du mir mal vormachen, wie das mit globalen Variablen funktionieren soll...

        Das ganze fasst man dann unter dem Tehema Reentranz-Probleme zusammen.

        Globale Variablen sind einfach die Steinzeit der Programmierung.

        Grüße

        Tom

    2. Hi,

      Mir ist noch was aufgefallen:

      $hallo="hallo";
      function los() {
      echo $hallo;
      }
      los();

      -->

      Notice: Undefined variable: hallo in C:\test.php on line 7

      Was soll das denn? Ich bin ja PHP-Fan und will es bestimmt nicht schlecht machen, aber wie kann man da anständig programmieren? Man sollte doch wohl noch auf Variabeln zugreifen können, die nicht im gleichen Block definiert wurden...
      Kann man das vielleicht die php.ini anpassen, um dieses Problem zu beheben?

      *SehnsüchtigaufPhp5wart*

      Grüße, Marko

      1. Hi,

        Mir ist noch was aufgefallen:

        $hallo="hallo";
        function los() {
        echo $hallo;
        }
        los();

        -->

        Notice: Undefined variable: hallo in C:\test.php on line 7

        Was soll das denn? Ich bin ja PHP-Fan und will es bestimmt nicht schlecht machen, aber wie kann man da anständig programmieren? Man sollte doch wohl noch auf Variabeln zugreifen können, die nicht im gleichen Block definiert wurden...
        Kann man das vielleicht die php.ini anpassen, um dieses Problem zu beheben?

        Moment mal was willst Du damit?
        function los ()

        Keine Variable übergeben?
        Na gut dann ist da auch keine Variable vorhanden:

        http://www.php.net/manual/de/functions.php

        Zu den variablen findest Du hier hilfe:

        http://www.php.net/manual/de/language.variables.scope.php

        1. Hi,

          Mir ist noch was aufgefallen:

          $hallo="hallo";
          function los() {
          echo $hallo;
          }
          los();

          -->

          Notice: Undefined variable: hallo in C:\test.php on line 7

          Was soll das denn? Ich bin ja PHP-Fan und will es bestimmt nicht schlecht machen, aber wie kann man da anständig programmieren? Man sollte doch wohl noch auf Variabeln zugreifen können, die nicht im gleichen Block definiert wurden...

          Das war natürlich nur ein Beispiel zur Verdeutlichung...
          In der Praxis werden meine Variabeln bestimmt in 20 Funktionen gebraucht. Mir wird gesagt, globals sind nicht gut und sinnlos! Stimmt das? Wie kann ich sonst eine Variable (nicht Konstante) definieren, die ich überall benutzen kann?

          Marko

          1. Moin!

            In der Praxis werden meine Variabeln bestimmt in 20 Funktionen gebraucht. Mir wird gesagt, globals sind nicht gut und sinnlos! Stimmt das? Wie kann ich sonst eine Variable (nicht Konstante) definieren, die ich überall benutzen kann?

            Nun ja, Konstanten wären eine gute Idee. Die sind überall verfügbar, sobald sie einmal definiert wurden. Und da Konfigurationswerte sich innerhalb eines Skriptes nicht ändern sollten (wenn doch, sind es keine Konfigurationswerte), wäre das eine gute Idee.

            Alternativ: Wenn du nicht 20 einzelne Variablen als global in einer Funktion definieren willst, pack sie alle in ein Array und definiere das in jeder Funktion als global. Das ist aber sehr schlechter Stil.

            Besser: Pack die Variablen in das Array und übergib es jeweils an die Funktion. Wahlweise auch als Referenz, das ist dann so gut, wie global, nur stressfreier und recht performanceunschädlich, weil nur ein Zeiger übergeben wird, nicht eine komplette Kopie des Arrays. Änderungen daran werden allerdings auch im globalen Array wirksam, also Vorsicht.

            Die vierte Alternative: Alle globalen Variablen stehen auch im Array $GLOBALS, welches auch in Funktionen verfügbar ist.

            Ich würde mit den Referenzen arbeiten.

            - 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>)
          2. Das war natürlich nur ein Beispiel zur Verdeutlichung...
            In der Praxis werden meine Variabeln bestimmt in 20 Funktionen gebraucht. Mir wird gesagt, globals sind nicht gut und sinnlos! Stimmt das? Wie kann ich sonst eine Variable (nicht Konstante) definieren, die ich überall benutzen kann?

            Und was heist 20 Funktionen? brauchst Du die tatsächlich?
            Hast Du mal ne vernünftige Konzeption geschrieben?

            Übrigens "nicht sinnvoll" ist nicht gleich "sinnlos":
            Ich persönlich hätte kein Problem damit 20 Variablen als global zu definieren.
            Wo es Sinn macht!

            Aber mir fällt ehrlich nichts ein wo es Sinn machen könnte.
            Aber mal ganz ehrlich was möchtest Du?
            Hast Du je ne richtige Programmiersprache benutzt?
            Nicht einmal bei VB kannst Du so ohne weiteres auf eine Variable zurückgreifen, bloß weil Du sie einmal definiert hast.

            Und PHP 5 ist bereits draussen, und wird Dein Problem nicht lösen.

            Tom

            1. Hi,

              Das war natürlich nur ein Beispiel zur Verdeutlichung...
              In der Praxis werden meine Variabeln bestimmt in 20 Funktionen gebraucht. Mir wird gesagt, globals sind nicht gut und sinnlos! Stimmt das? Wie kann ich sonst eine Variable (nicht Konstante) definieren, die ich überall benutzen kann?

              Und was heist 20 Funktionen? brauchst Du die tatsächlich?
              Hast Du mal ne vernünftige Konzeption geschrieben?

              Klar ;) Es ist ein Datenbank-Projekt. Da gibt es auf der einen Seite Konstanten, auf der anderen Seite aber auch Variabeln die verändert werden können sollen (im Bezug auf die Datenbank eben).

              Übrigens "nicht sinnvoll" ist nicht gleich "sinnlos":
              Ich persönlich hätte kein Problem damit 20 Variablen als global zu definieren.
              Wo es Sinn macht!

              Gut, dass du das sagst, bin ich gleich erleichtert, die benutze ich jetzt nämlich mit Erfolg.

              Aber mir fällt ehrlich nichts ein wo es Sinn machen könnte.
              Aber mal ganz ehrlich was möchtest Du?
              Hast Du je ne richtige Programmiersprache benutzt?
              Nicht einmal bei VB kannst Du so ohne weiteres auf eine Variable zurückgreifen, bloß weil Du sie einmal definiert hast.

              Ich konnte VB6 und kann C# und VB.NET, und da kann man auf Variabeln zugreifen, die ausserhalb des lokalen Bereichs stehen, ohne Probleme.

              Und PHP 5 ist bereits draussen, und wird Dein Problem nicht lösen.

              Doch, da kann man $this etc. benutzen, um an andere Variabeln zu gelangen.

              Marko

              1. Klar ;) Es ist ein Datenbank-Projekt. Da gibt es auf der einen Seite Konstanten, auf der anderen Seite aber auch Variabeln die verändert werden können sollen (im Bezug auf die Datenbank eben).

                Übrigens "nicht sinnvoll" ist nicht gleich "sinnlos":
                Ich persönlich hätte kein Problem damit 20 Variablen als global zu definieren.
                Wo es Sinn macht!

                Gut, dass du das sagst, bin ich gleich erleichtert, die benutze ich jetzt nämlich mit Erfolg.

                Hast Du mal Svens Vorschlag ins Auge gefasst?

                Das IMHO die elegante Lösung für das Problem.
                $this geht aber schon mit PHP4 irgendwas...
                Siehe Manual!
                Wenn Du auf richtige objektorientierung hin willst, dann solltest Du Dir tatsächlich zuerst mal das Manual reinziehen.
                Das dürfte einige Problem lösen.
                Deine Aussage zu C und VB& ist IMHO nicht richtig auch da kannst Du nur auf Klassen und Objekte referenzieren nicht aber auf Variablen. Das weiss ich eigentlich  ziemlich sicher obwohl meine aktive Zeit als Programmierer schon lange vorbei ist.
                Wenn ich da gerade Mist erzählt habe, möge man mich von Kompetenter Stelle eines besseren belehren.

                Viele Grüße aus Berlin

                Tom

          3. Hello,

            Wie kann ich sonst eine Variable (nicht Konstante) definieren, die ich überall benutzen kann?

            Wer oder was hält Dich davon ab, die Variable an alle Funktionen, dies was angeht, auch zu übergeben?

            Außerdem kannst Du Dir beliebig viele Arrays definieren:

            define ("ADULT",18);

            $datensatz = array();

            $datensatz["vorname"] = "Marko";
            $datensatz["beruf"] = "Programmierer-Lehrling";
            $datensatz["alter"] = unbekannt;

            Nun kannst Du dieses Array, in dem alle relevanten Daten zu Deiner Person geführt werden, an beliebig viele Funktionen übergeben.

            function adult_check($d)  {                                                                       if(is_num($d["alter"]))
              {
                if($d["alter"] >= ADULT)
                {
                  return "Person ist volljährig";
                }
                else
                {
                  return "Person ist minderjährig";
                }
              }
              else
              {
                return "Alter der Person unbekannt";
              }
            }

            Der Aufruf der Funktion

            Na, und so weiter.

            Wenn Du nun innerhalb der Funktion eine Veränderung der Daten des Arrays $datensatz zulassen willst, dann sagst Du PHP das bei der Funktionsdefinition:

            function adult_check(&$d)
            {
            }

            Schau Dir mal GENAU den Unterschied zwischen den Zeilen an.

            Ich denke, wenn Du mal alle Spielarten dieses "Kurzkurses" eigenständig nachvollziehst, dann dürfte Dir Strukturierung von Daten demnächst keine Probleme mehr bereiten.

            Tom

            PS: in die Testfunktion habe ich noch (mindestens) einen Fehler eingebaut. Musst mal ins Manual gucken, wo der wohl steckt.

      2. hi,

        Was soll das denn? Ich bin ja PHP-Fan und will es bestimmt nicht schlecht machen, aber wie kann man da anständig programmieren?

        rede nicht von anständig programmieren, wenn du davon _so wenig_ verstehst, wie deine frage den anschein erweckt.

        Man sollte doch wohl noch auf Variabeln zugreifen können, die nicht im gleichen Block definiert wurden...

        nein. das konzept der trennung zwischen lokalen und globalen variablen-bereichen wurde bestimmt nicht im sandkasten erfunden, sondern ergibt sich aus der notwendigkeit, bei grösseren projekten den überblick behalten zu können.

        gruss,
        wahsaga

      3. Hello,

        $hallo="hallo";

        function los($text)
        {
          if (strlen($text)==0)
          {
            return false;
          }

        echo $text;
          return true;
        }

        los();

        Mal so richtig schmutzig programmiert. Nassi-Shiderman dürfte ich heute Nacht nicht mehr begegnen *gg*

        Grüße

        Tom

        1. Hallo Tom,

          function los($text)
          [...]
          los();

          das wird dir eine Fehlermeldung wegen fehlendem Parameter beim Aufruf der Funktion los() ausspucken - du musst der Funkion den Text schon mitgeben: los($hallo).

          Grüße aus Nürnberg
          Tobias

          --
          Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
          1. Hello,

            function los($text)
            [...]
            los($hallo);

            das wird dir eine Fehlermeldung wegen fehlendem Parameter beim Aufruf der Funktion los() ausspucken - du musst der Funkion den Text schon mitgeben: los($hallo).

            Sollte doach auch drinstehen. Genauso, wie der Typ Shniderman heißt. Hab ich auch dreimal hingeguckt und immer noch war's falsch...

            Ich brauch doch ne Brille oder muss mal die Biersorte wechseln.

            Grüße

            Tom