Ankündigung

Einklappen
Keine Ankündigung bisher.

globale Variablen und OOP

Einklappen

Neue Werbung 2019

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

  • globale Variablen und OOP

    Hi Leutz,

    ich muss mich jetzt mal an euch wenden. Habe an anderer Stelle mal ne
    Codestrecke mit einer Frage dazu veröffentlicht, und bekam von allen
    Seiten nur Buh-Rufe: Globale Variablen...das macht man nicht, schlechter
    Stil...die müssen weg!

    BSP:
    PHP-Code:
    error_reporting (E_ALL);

    ini_set("display_errors"TRUE);

    class 
    functions {

        function 
    getMainCat($cat)
            {
            global 
    $lang;
            
    $db1 = new dbconn(hostuserpassname);

            if (empty(
    $cat)) {
                return 
    $lang["leftcontent"]["navigation"];
            } else {
                
    $sql "select * from " tbl_catalog " where cat_id='$cat'";
                
    $result $db1->query($sql);

                while (
    $data mysql_fetch_assoc($result))
                    if (
    $data["cat_parent_id"]) {
                        return 
    $this->getMainCat($data["cat_parent_id"]);
                    } else {
                        return 
    $data["cat_description"];
                    }
            }
            } 
    nun muss ich aber auf z.b. auf diverse Sprachpakete zurückgreifen. Die
    befinden sich in einem Ordner lang:
    BSP:
    PHP-Code:
    $lang["secondary_nav"]["Warenkorb"] = "Warenkorb";
    $lang["secondary_nav"]["Konto"] = "Mein Konto";
    $lang["secondary_nav"]["Versandkosten"] = "Versandkosten"
    Aber auch in der config befinden sich best. Array-Vars auf die u.U.
    zurückgegriffen werden muss. Die hab ich bis dato immer als globale
    Variablen eingebunden.

    Antwort/ Verbesserungsvorschläge habe ich von diesen Nörglern nicht
    bekommen.
    Vielleicht kann mir hier jemand sagen, warum meine Vorgehensweise
    soooooooo böse & schlecht ist und vor allem, wie ich es anders machen
    könnte

    mfG

    derTrallala

  • #2
    Re: globale Variablen und OOP

    Zitat von Timo Trallala
    Globale Variablen...das macht man nicht, schlechter
    Stil...die müssen weg!
    full ack

    übergib das Array im Kontructor der Klasse und speicher das ganze in ner Membervariable und gut ist, dadurch ist es überall im Objekt verfügbar und du hast keine globalen.

    Oder schreib dir Mehtode die das in ne Membervariable schreibt zb. setLang()

    Globale Variablen sind einfach fehleranfällig ein genaues Beispiel kann ich dir nicht geben aber es ist halt so weil globale von überall her geändert werden können und diese Stelle dann beim debuggen zu finden ist schwer.

    Kommentar


    • #3
      Grundsätzlich verdammen muss man globale Variablen nicht, denn ganz ohne geht es auch nicht. Und es ist auch ein Zeichen von schlechtem Design, wenn man sich wirklich globale Daten in jede Klasse aufs neue kopiert, zumahl es bei komplexeren Arrays unnötig Speicher frisst und Zeit...

      Aber wie HStev schon sagt, solltest du genau überlegen, wann und wo du globale Variablen einsetzt. Du solltest globale Variablen immer gut initialisieren (Stichwort register_globals, was einem "Hacker" Tür und Tor öffnen könnte) und du solltest zentrale Stellen haben, wo diese globalen Variablen abgefragt und manipuliert werden.

      In Zusammenhang mit OOP bietet sich an, wenige globale Instanzen zu halten, bei deinem Beispiel eine Art "LangRegistry". Diese Klasse ist einzig verantwortlich für die Auswertung und Rückgabe der Lang-Daten.
      PHP4: Eine Instanz wird in einer globalen Variable gespeichert (beispielsweise $langRegistry) und von überall genutzt. Die Lang-Daten befinden sich in der Klasse selbst als lokale Daten. Die Instanz wird an keine Funktion übergeben (PHP4 kopiert sonst eventuell das Objekt komplett).
      PHP5: Die Instanz befindet sich nicht mehr in einer globalen Variable, sondern einer statischen Klassenvariable. Dadurch kommt man ganz ohne globale Variablen aus.

      Kommentar


      • #4
        ja gut n PHP4 sollte man Referenzen nutzen bei sowas

        sorry hab mal wieder PHP5 vorausgesetzt

        Kommentar

        Lädt...
        X