Variablen trotz niedrigerem Scope sichtbar?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Variablen trotz niedrigerem Scope sichtbar?

    Hallo!

    Schreibe gerade ein mapper für den http_user_agent und da fiel mir folgendes auf:

    PHP-Code:
    foreach($browsers as $browser)
    {
        if (
    preg_match("#($browser[0])[/ ]?([0-9.]*)#"$s$match))
        {
            
    $bname $browser[1] ;
            
    //$version = $match[2]{1} . ".x";
            
    break ;
        }
    }

    foreach(
    $os as $opsys)
    {
        if (
    preg_match("#($opsys[0])[/ ]?([0-9.]*)#"$s$match))
        {
            
    $oname $opsys[1] ;
            break ;
        }
    }

    echo 
    $bname " :- " $oname
    Es erfolgt tatsächlich eine korrekte Ausgabe - wie kann es sein, dass bname und oname bekannt sind?

    Danke

  • #2
    Zitat von limaleet Beitrag anzeigen
    Es erfolgt tatsächlich eine korrekte Ausgabe - wie kann es sein, dass bname und oname bekannt sind?
    Vielleicht, weil sie per Default in den gängigen Browsern in genau dem, was du gerade auswertest, nämlich dem User Agent String, mitgesendet werden vom anfragenden Client ...?
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Hallo wahsaga,

      leider stehe ich gerade völlig auf dem Schlauch, wie meinst du das genau?
      Wenn ich die Variable $oname123hahablabla_hallo_wahsaga nenne, so funktioniert es immernoch, kann doch kein Zufall sein..

      edit:

      Mal etwas einfacher:

      PHP-Code:
      if (true)
          {
              
      $text "123";
          }
          
          echo 
      $text
      Warum wird tatsächlich 123 ausgegeben? Das überrascht mich total, obwohl ichschon längere Zeit mit PHP arbeite... mir ist keine andere Sprache bekannt, in der das auch so ist..

      Hat das was mit reg_globals oder so zu tun?
      Zuletzt geändert von limaleet; 04.06.2010, 22:43.

      Kommentar


      • #4
        Zitat von limaleet Beitrag anzeigen
        kann doch kein Zufall sein..
        Ist es nicht, Interpretersprachen haben meist eine sehr dynamische Symboltabelle.

        Zitat von limaleet Beitrag anzeigen
        mir ist keine andere Sprache bekannt, in der das auch so ist..
        Es gibt da noch sowas, das nennt sich JavaScript
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Zitat von limaleet Beitrag anzeigen
          Es erfolgt tatsächlich eine korrekte Ausgabe - wie kann es sein, dass bname und oname bekannt sind?
          Ach so, ich glaube jetzt versteh' ich deine Frage erst ...

          Du meinst, warum die Anweisungsblöcke, die von den geschweiften Klammern nach foreach/if umgeben sind, keinen eigenen Scope bilden und damit die darin verwendeten Variablen lokal wären?

          Das ist PHP nun mal so ... - und ehrlich gesagt, bin ich momentan nicht mal in der Lage, im Manual die Stelle zu finden, an der das explizit beschrieben wird. (Anyone ...?)
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Zitat von wahsaga Beitrag anzeigen

            Du meinst, warum die Anweisungsblöcke, die von den geschweiften Klammern nach foreach/if umgeben sind, keinen eigenen Scope bilden und damit die darin verwendeten Variablen lokal wären?
            Jope, genau das mein ich

            Und dabei erinnere ich mich noch an das blöde Buch vor zig Jahren, das behauptete, man müsste im Scope benutze Arrays vor dem Scope mit $test = array(); deklarieren, da man sie sonst später nicht mehr verwenden könnte - bis gerade eben hab ich das geglaubt und lustigerweise in PHP immer alles so programmiert wie in Java und Co.

            edit: heißt das etwa, es gibt in PHP keine lokalen Variablen - von Funktionen und OOP mal abgesehen?
            Zuletzt geändert von limaleet; 04.06.2010, 23:44.

            Kommentar


            • #7
              Es steht nirgends explizit im Manual.

              Der Interpreter startet mit einer Symboltabelle, der globalen, in der alles steht, was man auch in $GLOBALS findet.
              Jede Funktion und jede Klasse bekommt ihre eigene Symboltabelle.
              Aber Blöcke (von geschweiften Klammern umschlossener Code) bekommen keine eigene Symboltabelle.

              Kommentar


              • #8
                Danke! dann wäre

                Zitat von limaleet Beitrag anzeigen
                edit: heißt das etwa, es gibt in PHP keine lokalen Variablen - von Funktionen und OOP mal abgesehen?
                also mit Ja zu beantworten. Das war mir echt neu und verwundert mich gerade sehr.. wieder was gelernt.
                Zuletzt geändert von limaleet; 04.06.2010, 23:51.

                Kommentar


                • #9
                  Seit der Einführung von Namespaces ist es nicht mehr ganz so einfach wie ich oben schrieb. Es gibt immer noch den globalen Scope, aber er ist jetzt gleichzeitig ein Namespace (\). Jeder Namespace bekommt seine eigene Symboltabelle und jede in diesem Namespace definierte Funktion, Klasse oder Namespace bekommt darin sozusagen eine "Untertabelle".
                  Da man Namespaces allerdings nicht mitten in einer Funktion, Klasse oder Block definieren kann, macht das für dich keinen Unterschied. Blöcke bilden nach wie vor keinen eigenen Scope.

                  Kommentar


                  • #10
                    Ich finds gut so, wie es ist!

                    Warum sollen einfache (Schleifen,if) Blöcke einen eigenen "Gültigkeitsbereich" haben?
                    Wie soll man denn da Daten rein oder raus bekommen?
                    Übergeben, wie bei Funktionen oder Methoden geht ja nicht...


                    mir ist keine andere Sprache bekannt, in der das auch so ist..
                    Übrigens:
                    C, C++, Java, PAscal und so weiter, handeln das ganz genau so ab!
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      Zitat von combie Beitrag anzeigen
                      Warum sollen einfache (Schleifen,if) Blöcke einen eigenen "Gültigkeitsbereich" haben?
                      Wie soll man denn da Daten rein oder raus bekommen?
                      Ist Geschmackssache, ich persönlich finde es besser, wenn jeder Scope seine eigene "Sandbox" darstellt. Wenn ich z.B. an verschiedenen Stellen im Code innerhalb eines Blocks nochmal while-Schleifen o.ä. mit Laufvariablen benutze, so kann ich ohne extra Acht geben zu müssen überall die selben Laufvariablen bneutzen, ohne sie zuvor resetten zu müssen. Das ist nur ein Beispiel von vielen.

                      Zitat von combie Beitrag anzeigen
                      Übrigens:
                      C, C++, Java, PAscal und so weiter, handeln das ganz genau so ab!
                      Da muss ich dir leider widersprechen
                      In Java als auch C# bedeutet eigener Block (egal wo und wie, hauptsache Klammern) immer lokaler Bereich für alle Variablen darin. C/C++ weiß ich gerade nicht, würde mich aber wundern wenn es nicht so wäre.

                      edit: in c/c++ ist es genau so. In einem Block definierte Variablen gelten nur dort und "sterben", wenn der Block zu geht. Sie sind aber natürlich an innere Blöcke "vererbbar".
                      Zuletzt geändert von limaleet; 05.06.2010, 00:56.

                      Kommentar


                      • #12
                        In Java als auch C# bedeutet eigener Block (egal wo und wie, hauptsache Klammern) immer lokaler Bereich für alle Variablen darin.
                        Das glaube ich dir nicht!

                        Bedenke:
                        Wenn du keine Daten aus einer Schleife herein und heraus bekommst, dann ist die Schleife meist Sinnfrei.

                        Beachte die Verwendung von i

                        Code:
                            public void wuerfeleBisZurSechs()
                            {
                                int i=1;
                         
                                // Erster Wurf muss auf jeden Fall durchgeführt werden
                                int zwischenspeicher=wuerfel.getZufallszahl(6);
                                System.out.println("Wurf "+i+ " ist "+zwischenspeicher);
                         
                                // weitere Würfe
                                while (zwischenspeicher!=6){
                                    i++;
                                    zwischenspeicher=wuerfel.getZufallszahl(6);
                                    System.out.println("Wurf "+i+ " ist "+zwischenspeicher);  
                                }
                            }
                        Aus: Java/while-Schleife ? ZUM-Wiki
                        Zuletzt geändert von combie; 05.06.2010, 01:03.
                        Wir werden alle sterben

                        Kommentar


                        • #13
                          Außerhalb der Schleife definierte Variablen sind natürlich auch innerhalb der Schleife verwendbar, und auch in allen Unterblöcken (if,else,whatever) in der Schleife drin.

                          Hier ging es ja darrum, dass bei PHP innerhalb von Blöcken definierte Dinge auch außerhalb sichtbar sind, also der Weg genau andersrum.

                          edit zu deinem edit: denke es ist klar mit obigem Text. Das ganze läuft ab wie ein Wasserfall. Du kommst runter, aber nicht mehr hoch.

                          Siehe Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 2.4 Blöcke, Initialisierung und Sichtbarkeit

                          C Referenz -Globale und lokala Variablen-

                          edit2: nochmal ein einfaches Beispiel:

                          Code:
                          int zahl = 5;
                          
                          if(true) {
                              System.out.println(zahl);   // gibt 5 aus
                          }
                          
                          ///// aber
                          
                          
                          
                          if(true) {
                               int zahl = 5;
                          }
                          System.out.println(zahl);  // kompiliert nicht mal
                          Zuletzt geändert von limaleet; 05.06.2010, 01:09.

                          Kommentar


                          • #14
                            Hier ging es ja darrum, dass bei PHP innerhalb von Blöcken definierte Dinge auch außerhalb sichtbar sind, also der Weg genau andersrum.
                            Das ist eine php Interpreterspracheneigenheit.

                            Bei den Kompilersprachen kannst du in Schleifen keine Variablen erzeugen/anlegen/definieren

                            Aber nichts desto trotz ist der Gültigkeitsbereich derselbe.
                            Egal ob c# oder PHP.
                            Wir werden alle sterben

                            Kommentar


                            • #15
                              Hey combie,

                              ich glaube du denkst da schon besser/weiter als ich oder wir reden aneinander vorbei.

                              Klar kann ich in Kompilersprachen Variablen in Schleifen oder sonstwas erzeugen/anlegen/definieren und sie dort auch wunderbar benutzen. Und ihr Gültigkeitsbereich ist eben am Scopeende zu Ende, was in PHP nicht so ist.

                              Dass das eine Angelegenheit des Interpretes ist sehe ich auch so, aber deswegen sind die Gültigkeitsbereiche doch trotzdem Grundverschieden.

                              Kommentar

                              Lädt...
                              X