Karin: Globale Variablen in PHP

Hallo,

mir (PHP-Anfänger) ist nicht so ganz klar warum man in PHP normalerweise mit

define ('MEINE_GLOBALE_VAR', "wert1");

eine globale variable definieren sollte.

Wenn ich einfach

$meine_globale_var = "wert1";

definiere kann ich die Variable doch auch überall nutzen (muss sie nur anders notieren).

Was ist an der ersten Version besser?
Danke
Karin

  1. Moin,

    mir (PHP-Anfänger) ist nicht so ganz klar warum man in PHP normalerweise mit

    define ('MEINE_GLOBALE_VAR', "wert1");

    eine globale variable definieren sollte.

    sollte man nicht, das ist wohl ein Missverständnis. Mit dem obigen Code-Auszugs definierst du keine Variable, sondern eine Konstante. Das ist ein wesentlicher Unterschied; in erster Linie kann man Konstanten keinen neuen Wert zuweisen, außerdem werden sie im Programm ohne vorangestelltes '$' notiert, das eine Variable kennzeichnet.

    Wenn ich einfach

    $meine_globale_var = "wert1";

    definiere kann ich die Variable doch auch überall nutzen (muss sie nur anders notieren).

    PHP verhält sich etwas eigenwillig. Globale Variablen sind nämlich in PHP nicht wirklich global; innerhalb von Funktionen sind sie nicht verfügbar (außer man macht sie innerhalb der Funktion mit dem Keyword global erneut bekannt. Für Konstanten gilt diese Einschränkung nicht.

    Was ist an der ersten Version besser?

    Nichts. Es sind zwei völlig unterschiedliche Dinge.

    Und generell solltest du versuchen, globale Variablen soweit wie möglich zu vermeiden.

    So long,
     Martin

    --
    Letztlich basiert alles auf dem Feuer, dem Rad, der Eins und der Null.
      (Gernot Back)
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Tach!

      Und generell solltest du versuchen, globale Variablen soweit wie möglich zu vermeiden.

      Das kommt ganz auf das Konzept an. Für größere und gut strukturierte Projekte ergibt sich solch ein Verzicht von selbst aus der Erfahrung. Für einfach runtergeschriebene Scripte mit nur wenigen oder keinen selbst geschriebenen Funktionen sehe ich keine Notwendigkeit globale Variablen zu meiden - man hat dann ja im Wesentlichen nur den einen Scope.

      dedlfix.

      1. Hi,

        Und generell solltest du versuchen, globale Variablen soweit wie möglich zu vermeiden.
        Das kommt ganz auf das Konzept an. Für größere und gut strukturierte Projekte ergibt sich solch ein Verzicht von selbst aus der Erfahrung. Für einfach runtergeschriebene Scripte mit nur wenigen oder keinen selbst geschriebenen Funktionen sehe ich keine Notwendigkeit globale Variablen zu meiden - man hat dann ja im Wesentlichen nur den einen Scope.

        ja, aber dann ist man sich des Unterschieds in der Regel auch nicht bewusst und kommt nicht auf die Idee, gezielt zu _globalen_ Variablen zu fragen. Karin gibt zwar an, "PHP-Anfänger" zu sein, aber vielleicht kennt sie die Thematik globale vs. lokale Variablen schon aus anderen Programmiersprachen (auch wenn das nach der Fragestellung eher unwahrscheinlich ist).

        Ciao,
         Martin

        --
        Zwei Politiker auf dem Weg zum Sitzungssaal: "Was sagten Sie in ihrer Rede neulich noch zur Rentenreform?" - "Nichts." - "Ja, schon klar. Aber wie haben Sie es formuliert?"
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      2. Moin,

        ... Für größere und gut strukturierte Projekte ergibt sich solch ein Verzicht von selbst aus der Erfahrung.

        Wieso? Wenn ich etwa eine Datenbank öffne und möchte in Funktionen darauf zugreifen, definiere ich die connect_id bisher in jeder Funktion als global.

        Wäre doch überflüssig. Oder kann man eine im Programm gewonnene Erkenntnis (etwa die connect_id) nicht als Konstante definieren?

        ... nachdenk. Ich könnte doch die "Konstante" $_POST['wert'] ändern und $_POST ist immer global - oder?

        Gast

        1. Tach!

          ... Für größere und gut strukturierte Projekte ergibt sich solch ein Verzicht von selbst aus der Erfahrung.

          Wieso? Wenn ich etwa eine Datenbank öffne und möchte in Funktionen darauf zugreifen, definiere ich die connect_id bisher in jeder Funktion als global.

          Dann ist dein Projekt noch nicht groß genug. Denn so baust du dir Abhängigkeiten von einem globalen Wert ein. Solche Abhängigkeiten stören zum Beispiel dann, wenn man objektorientiert "mit allen Schikanen" programmieren möchte.

          Wäre doch überflüssig. Oder kann man eine im Programm gewonnene Erkenntnis (etwa die connect_id) nicht als Konstante definieren?
          ... nachdenk. Ich könnte doch die "Konstante" $_POST['wert'] ändern und $_POST ist immer global - oder?

          $_POST ist superglobal, ja. Um jedoch starre Abhängigkeiten zu vermeiden, kann man Werte oder auch das gesamte Array als Parameter an die verarbeitende Funktion/Methode übergeben. Damit wird sie gleich flexibler, weil auch Daten aus anderen Quellen mit ihr verarbeitet werden können.

          dedlfix.

        2. hi,

          ... Für größere und gut strukturierte Projekte ergibt sich solch ein Verzicht von selbst aus der Erfahrung.

          Wieso? Wenn ich etwa eine Datenbank öffne und möchte in Funktionen darauf zugreifen, definiere ich die connect_id bisher in jeder Funktion als global.

          Damit lieferst du auch genau den Grund warum Global nicht so toll sein muss.
          Es ist zwar praktisch sich so zu merken, dass die Verbindung bereits offen ist, damit man sie nicht neu aufmacht. Doch was ist, wenn du mal auf eine 2. Datenbank zugreifen möchtest? Dann knallt es etwas.

          Das geht dann zwar wirklich ins Objektorientierte, aber eben das vervielfältigte bzw. kopieren von manchem, ist ein Problem bei globalen Variablen.

          Gruß Niklas

          --
          Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
    2. hi,

      PHP verhält sich etwas eigenwillig. Globale Variablen sind nämlich in PHP nicht wirklich global; innerhalb von Funktionen sind sie nicht verfügbar (außer man macht sie innerhalb der Funktion mit dem Keyword global erneut bekannt.

      Es gibt doch aber $GLOBALS und auch statische Klassen:

        
      <?php  
      $GLOBALS["test"] = "abc";  
      class MyGlobal {  
      	public static $test = "def";  
      }  
      function testGlobals() {  
      	echo $GLOBALS["test"];  
      	echo MyGlobal::$test;  
      }  
      testGlobals();  
      
      

      Ausgabe: abcdef

      mfg

      tami