Von Klasse auf globale Variabel zugreifen

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

  • Von Klasse auf globale Variabel zugreifen

    Hallo Ihr,

    Hab eine datei(common.php) die auf jede einzelne seite(seite1.php,seite2.php,...) eingebunden wird.
    In der common.php wird auch eine verbindung zur datenbank hergestellt, dessen rückgrabewert ich in die variabel $connection lege.

    Nun ist mein problem, dass ich in einigen klassen die mysql verbindung benötige, also die $connection.
    Weil mysqli_query arbeitet ja mit diesen syntax ($connection, "SELECT...").

    Jetzt ist das ziemlich blöd, weil ich die $connection nicht in die klasse bring, und ich will sie auch nicht gern mit einem parameter an die klasse übergeben.

    Hab schon versucht mittels global die $connection in die klasse zu bringen, leider vergebens.

    Wie würdet ihr dieses Problem am besten lösen, oder habt ihr irgendwelche gedankenanstöße?

    Ich hoffe ihr denkt euch nicht wieder, dass ich euch ausnutze

    danke
    mfg

  • #2
    Klassen und global sind in der Regel ein Zeichen dafür, dass irgendetwas schief gelaufen ist. Es ist nicht im Sinne der OOP. Von Klassen benötigte Parameter sollten an den Konstruktor der jeweiligen Klassen übergeben werden, oder man arbeitet mit dem Singleton-Entwurfsmuster.

    PHP-Code:

    // a.php

    class DatabaseConnection
    {
        public 
    $connection;

        public function 
    __construct()
        {
            
    $this->connect();
        }

        public function 
    connect()
        {
             
    $this->connection connect_to_db();
             return 
    $this->connection;
        }
    }

    $db_conn = new DatabaseConnection();

    // b.php

    class Test
    {
        private 
    $_db_connection;

        public function 
    __construct(DatabaseConnection $db_conn)
        {
            
    $this->_db_connection $db_conn;
        }
    }

    $test = new Test($db_conn); 
    Zuletzt geändert von Griecherus; 26.07.2007, 22:05.
    Nieder mit der Camel Case-Konvention

    Kommentar


    • #3
      danke erstmal.

      hab mir das jetzt ein bisschen angeschaut, aber ich versteh den sinn von der a.php nicht.

      da wird doch eine neu verbindung zur mysql_db hergestellt, kann ich nicht mit meiner $connection in der common.php weiterarbeiten?

      Und die parameter an den constructer schicken würde ich auch gern umgehen.

      weil ich denk mir dass das mit der zweiten mysql_verbindung auch in die performance geht, oder lieg ich da falsch?

      mfg

      Kommentar


      • #4
        Original geschrieben von rundmc
        danke erstmal.

        hab mir das jetzt ein bisschen angeschaut, aber ich versteh den sinn von der a.php nicht.

        da wird doch eine neu verbindung zur mysql_db hergestellt, kann ich nicht mit meiner $connection in der common.php weiterarbeiten?

        Und die parameter an den constructer schicken würde ich auch gern umgehen.

        weil ich denk mir dass das mit der zweiten mysql_verbindung auch in die performance geht, oder lieg ich da falsch?

        mfg
        Du hast den Sinn meines Postings falsch verstanden, glaube ich.
        Das ist nur ein abstraktes Beispiel gewesen, wie man Parameter an eine Klasse übergibt, um dir die Herangehensweise zu verdeutlichen.

        Aus welchem Grund möchtest du denn vermeiden, den Klassen die benötigten Parameter über den Konstruktor zu übergeben? Alternativ gibt es noch Singleton Entwurfsmuster, das aber auch nicht unbedingt missbraucht werden sollte.

        PHP-Code:

        // a.php

        class DatabaseConnection
        {
            private static 
        $_instance null;

            public static function 
        get_instance()
            {
                if (
        self::$_instance === null)
                {
                    
        self::$_instance = new DatabaseConnection();
                }

                return 
        self::$_instance;
            }

            public function 
        connect()
            {
                
        $connection connect_to_db();
                return 
        $connection;
            }
        }

        // b.php

        class Test
        {
            public function 
        do_something()
            {
                
        $db_conn DatabaseConnection::get_instance();
                
        $db_conn->connect();
            }
        }

        $test = new Test();
        $test->do_something(); 
        Nieder mit der Camel Case-Konvention

        Kommentar


        • #5
          ok, danke

          dann werd ich wohl die parameter an die klasse übergeben müssen.
          Leider

          mfg peter

          Kommentar


          • #6
            Original geschrieben von rundmc
            ok, danke

            dann werd ich wohl die parameter an die klasse übergeben müssen.
            Leider

            mfg peter
            Ich habe das Gefühl, dass du nicht wirklich auf meine Postings eingehst..
            Wenn du nichts sagst, kann dir auch nicht geholfen werden.
            Parameter an eine Klasse zu übergeben ist der gebräuchlichste Weg, deswegen frage ich mich bzw. dich, inwiefern das problematisch für dich ist (abgesehen von dem Aufwand, die jeweiligen Klassen zu modifizieren).
            Nieder mit der Camel Case-Konvention

            Kommentar


            • #7
              Re: Von Klasse auf globale Variabel zugreifen

              Ich verstehe eines nicht: Du programmierst objektorientiert, verwendest aber die mysqli-Funktionen.

              Sei einfach konsequent!

              $mysqli_obj = new mysqli(...);
              $mysqli_obj->query(...);


              @topic: Dein Problem ist eigentlich ein anderes als du glaubst Es geht nicht darum, wie man am saubersten eine globale DB-Verbindung in der DB-Klasse verfügbar macht. Dein Fehler ist, dass du überhaupt eine globale Verbindung hast!
              Statt irgendwo dein $connection zu erzeugen (oder besser $mysqli_obj) solltest du an eben dieser Stelle lieber deine DB-Klasse instanziieren und diese stellt in ihrem Konstruktor die Verbindung zur DB her.

              Kommentar

              Lädt...
              X