wie ohne $GLOBALS auf klasse zugreifen

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

  • wie ohne $GLOBALS auf klasse zugreifen

    hallo,
    ich hab 2 klassen (db und error), und ich habe ganz viele plugins, die sich halt auch ändern, bzw. die halt auch von anderen geschrieben werden können sollten. das problem ist jetzt, dassalle plugins auf die mysql klasse, aber auch auf die fehlerklasse zugreifen müssen.

    aber irgendwie fehlt mir ein sinnvoller lösungsansatz, bzw. mir fällt nichts besseres ein als..
    im "hauptprogramm", die db und fehlerklasse einzubinden, und mit
    PHP-Code:
    $GLOBALS['mysqldb'] = new mysql(); 
    zu "starten".

    oder, ich muss die 2 klassen in der plugin-datei requiren, und starten, was aber total sinnlos wäre.

    wie löst ihr solche probleme? werde da ja wohl nicht der einzigste sein. -anders könnte man vielleicht(!) noch der module-klasse, die die plugins-einfügt, und in seine klasse mit aufnimmt, die mysql-verbindung etc irgendwie übergeben. aber weiß nicht so richtig.

    wie gesagt, erzählt einfach mal, wie ihr das macht. bitte aber für php4 (über sinn und unsinn von php4 müssen wir nicht diskutieren, ist vorgegeben)

    falls jemand größere projekte prozedural schreibt, da ja oop in php4 noch nicht wirklich toll möglich ist, auch immer her damit. erzählt einfach mal, wie ihr sowas lösen würdet, die "wahrheit" findet sich am ende irgendwie zwischen meiner und eurer wahrheit

    mfg
    lm

  • #2
    Ich habe es ähnlich wie du gelöst, ich habe am anfang eine Datei "constructor.php", wo dann die Language, Template, DB, [...] - Klassen included und instalziert werden.
    Wenn ich dann ein Modul (z.B. News) habe, hole ich die Klassen da mit globals $db, $language; rein.
    Desweiteren habe ich z.B. ein "core" Modul, welches die einzelnen Ausgabemodule (hier wieder News) included und instanziert, innerhalb der Klasse (nested classes).
    Wenn man das anders lösen könnte, würde mich das auch interessieren.

    Kommentar


    • #3
      Da habt ihr dann wohl eher ein Designproblem.

      Wenn zB Error ein DB-Objekt braucht, wird das halt bei der Instantiierung eines Error-Objektes als Parameter übergeben und als Klassenvariable eingesetzt. Plugins müssen ähnlich die Möglichkeit kriegen, darauf zuzugreifen.

      global ist einfacher, aber unsinniger, denn damit umgehst du ja gerade die Datenkapselung. Eigentlich ist etwas falsch, wenn man global benutzt
      Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
      var_dump(), print_r(), debug_backtrace und echo.
      Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
      Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
      Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

      Kommentar


      • #4
        Singleton statt Übergabe an Parameter geht auch

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          sorry, dass ich erst jetzt wieder schreibe, es gab viel zu tun.

          singleton benutze ich auch zum teil, gerade dort wo nur vereinzelte funktionen auf diese klasse angewiesen sind.

          @shurakai
          das ist möglich, dass ich da ein designproblem habe, aber dann führe ich doch durch haufend funktionen haufend klassen mit. also ja ann auch innerhalb einer klasse. ich hab z.b. eine "start-funktion" in der core-klasse, diese lädt alle anderen klassen. nur bleibt es ja nicht bei der einen funktionen, sonder ich müsste ja das an jede folgende weitergeben, was -wie ich finde- ziemlich bekloppt wäre.

          klar, datenkapselung ist fehlanzeige. den einzigste vorteil, denn man noch hat ist, dass es übersichtlicher ist, und dann z.b. eine plugin-funktion genauso heisen kann, wie eine core-funktionen. für mehr dienen die klassen bei mir nicht, ist aber natürlich nicht unbedingt sinn der sache, mit php4 aber auch blöd zu ändern. -also finde ich. was sagst du, vielleicht hab ich auch nur irgendwann mal was flasch verstanden. mache das halt nur schon seit ein paar jahren so, und hab mich jetzt mal gefragt, dass das doch eigentlich bekloppt ist.

          Kommentar


          • #6
            Ich verstehe dein Problem leider nicht...

            Du kannst:

            - Dem Konstruktor Objekte übergeben und diese, falls mehrfach benötigt, zB als Klassenattribute abspeichern
            - An Methoden Objekte übergeben
            - Objekte in den Methoden neu erzeugen
            - Objekte per Singleton holen

            Ist alles ganz easy, dass man denkt dass das ja nicht so schön ist, hatte ich früher auch, aber das ist schon okay so. :-)
            Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
            var_dump(), print_r(), debug_backtrace und echo.
            Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
            Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
            Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

            Kommentar


            • #7
              hm, hast irgendwie recht. vin irgendwie nicht auf die idee gekommen, dass ich das objekt einer klassenvariable übergeben kann. muss mal schauen, ob ich dann wirklich komplett ohne globals auskomme. danke jedenfalls

              Kommentar


              • #8
                Re: wie ohne $GLOBALS auf klasse zugreifen

                Original geschrieben von leiermann
                ich hab 2 klassen (db und error), und ich habe ganz viele plugins, die sich halt auch ändern, bzw. die halt auch von anderen geschrieben werden können sollten. das problem ist jetzt, dassalle plugins auf die mysql klasse, aber auch auf die fehlerklasse zugreifen müssen.
                hi,
                könntest du ja so machen. eine abstrakte klasse plugin, in der die error- und db-klasse (jeweils als singleton implementiert) als klassenvariablen gehalten werden. diese könntest du im konstruktor zuweisen.
                die abstrakte methode, z.b. execute(), sollen alle plugins bereitstellen, die von plugin abgeleitet werden.
                würde dann in php5 so aussehen:
                PHP-Code:
                abstract class plugin
                {
                 protected 
                $db_object=null;
                        
                 protected 
                $error_object=null;
                        
                 public final function 
                __construct()
                  {
                   
                // Singleton der DB- und Error-Klasse als Member zuweisen
                   
                $this->db_object=db::getInstance();
                   
                $this->error_object=error::getInstance();
                  }

                 
                // Diese Methode sollen alle Plugins bereitstellen
                 
                abstract public function execute();
                }


                // Innerhalb dieses Plugins kann per $this->db_object auf das
                // Datenbankobjekt zugegriffen werden (respektive Error)
                class plugin_xyz extends plugin
                 
                {
                  public function 
                execute()
                  {
                   
                // Hier konkrete Implementierung des Plugins
                  
                }

                Kommentar

                Lädt...
                X