[PHP] Variablengeltungsbereich

  • In JS isses ja so, wenn man ne anonyme function iwo deffiniert, kann man darin auch die Variablen verwenden, die in dem Bereich gelten, in dem man sie deklariert. Ich habe in PHP jetzt aber folgendes problem:

    PHP
    $IDPP=new idpp(true);
    function err_msg($text, $type) {
        return $IDPP->getTemplate()->err_msg($text, $type);
    }

    Normalerweise klappt alles super, aber wenn jetzt ne andere klasse die ja global verfügbare funktion err_msg() aufruft, kommt:

    Code
    [B]Notice[/B]:  Undefined variable: IDPP in [B]C:\Programme\xampp\XXX\index.php[/B] on line [B]5[/B]
    
    
    [B]Fatal error[/B]:  Call to a member function getTemplate() on a  non-object in [B]C:\Programme\xampp\XXX\index.php[/B]  on line [B]5
    [/B]

    Kann mir das bitte einer erklären?

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • err_msg() mag vielleich global sein, aber $IDPP nicht. Deshalb kommst du gar nicht bis err_msg().

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Den Sinn dieser Funktion sehe ich nicht. Wenn du das Objekt hast, musst du in dem Fall keine Extrafunktion draus basteln.

    Alternativ: Objekt als Funktionsparameter übergeben oder (unschön) $_GLOBALS nutzen.

  • Danke für die schnellen Antworten!
    Das Problem ist, dass die Funktion err_msg eben vom Template veränderbar sein soll, ich aber aber des Template nich global machen will und das die Funktion eben schon in 30-40 mal kreuz und quer verbaut is. Aber gut, ich machs jetzt erstmal via $_GLOBALS.
    EDIT: Hm, die Variable Globals scheints nich zu geben.... son mist aber auch.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Das Problem ist, dass die Funktion err_msg eben vom Template veränderbar sein soll, ich aber aber des Template nich global machen will [...]

    Du weißt, dass eben dafür globale Variablen da sind, oder? ;)
    Entweder du machst es zum Teil des Templates, übergibst sie oder machst sie global.

    PHP
    $IDPP=new idpp(true);
    function err_msg($text, $type) {
        global $IDPP;
        return $IDPP->getTemplate()->err_msg($text, $type);
    }

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Weil du nie genau weist ob deine Variable von irgendwo anders genutzt wird
    überschrieben wird oder gelöscht wird etc


    mfg

  • Weil du nie genau weist ob deine Variable von irgendwo anders genutzt wird
    überschrieben wird oder gelöscht wird etc

    soweit ich weiß, beherrschen einzelne PHP-Scripts keine Parallelverarbeitung und sind somit ein rein iterativer Prozess. Damit weiß man den Inhalt zu jedem Zeitpunkt.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Vom Prinzip her richtig. Aber globale Variablen sind eine Katastrophe, wenn sich ein Fehler in einem größeren Projekt eingeschlichen hat. Fehlersuche ist da kein Vergnügen mehr.

  • Ja, aber wenn ich die variable überall übergebe oder in einer registry einbaue, ist es das selbe.
    grundsätzlich jede variable, die oft verfügbar sein muss, ist so eine fehlerquelle.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Beim Zugriff über global lassen sich Werte verändern, bei Parameterübergabe nicht unbedingt, nur bei Referenzen. Da kannst du schon einige Fehlerquellen ausschließen.

  • ja, aber wenn ich variablen ändern will, schreibe ich eine zuweisung. und wenn sie nicht verändert werden sollen, dann ist da auch keine zuweisung. also werden die werte auch nicht geändert, außer es wird gewünscht. und wenn es dann doch falsch ist, ist es ein rein logisches problem, das man sonst auch überall hat.

    oder schreibst du mitten in deinem programm irgendwo einfach "$wichtigeVariable = rand(0,100000);"?

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Dodo, gehe doch nicht davon aus, dass du alleine an einem Projekt arbeitest. Denke mal in größerer Dimension, sollte dir doch nicht schwer fallen. Arbeiten mehrere Leute an einem Projekt und alle benutzen globale Variablen, was glaubst du, wie lange das gut geht?

  • ganz einfach: solange die globalen variabel sinnvoll gewählt werden und andere einfach übergeben werden, dann klappt alles reibungslos.

    Beispiel:

    $dataBaseReference wäre global total sinnvoll und das auch begründet. warum sollte jedes unterprogramm eine datenbankverbindung aufbauen, oder warum sollte ich die immer übergeben?

    Vergleichbare Variablen sollen in meinen Augen IMMER global sein. Dafür gibt es das ja.
    Alle anderen kleinen Variablen, die fast nirgendwo gebraucht werden, können ruhig übergeben werden. Sollen die geändert werden, gibts call by reference.

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Nich lange^^.
    Das problem lag aber nich am Variablengeltungsbereich, sondern weil ich idiot im KOnstruktor von idpp gelich eine Methode aufrufe, die nen riesen Stein ins laufen bringt und der err_msg benutzt, befor $IDPP verfügbar is.
    Die Lösung war

    PHP
    include("includes/registry.php");
    $IDPP=new idpp(true);
    registry::set("IDPP", $IDPP);
    function err_msg($text, $type) {
        $tmp=registry::get("IDPP")->getTemplate();
        return $tmp->err_msg($text, $type);
    }
    $IDPP->load();


    Vielen Dank an euch!

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Gut dann wurde es ja geklärt ;)


    Ansonsten zum Abschluss:

    Jedem das seine aber wenn man schon mit OOP anfängt dann richtig und nicht das gefrickel mit global


    Beispiel:

    Stell dir vor in deinem Projekt wird eine externe Bibliothek eingebaut
    auf die hast du eigentlich gar keinen Zugriff bzw. interessiert dich nicht weil sie getestet ist und funktioniert und diese nutzt globals
    genauso wie du auf einmal überschreiben sich die systeme gegenseitig,
    das kann dir mit ner registry nicht passieren vllt. hat die bibliothek ne eigene registry, aber definitiv wird sie nicht deine registry nutzen

    Ps man kann auch mit der Registry Werte/Vars für andere Programmierer sperren

    mfg

  • Ja, Bei bedarf werd ich die registey-klasse um/neuschreiben. Mit Java OOP hab ich mich auch auseinandergesetzt (basiert ja auch drauf xD) aber bei PHP hab ichs nur überflogen. Werd des mal komplett durchlesen&verinnerlichen.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!