Probleme mit Klassen und Objekten und statischen Funktionen innerhalr der Klasse

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

  • Probleme mit Klassen und Objekten und statischen Funktionen innerhalr der Klasse

    Hallo liebe Leute.

    Ich habe ein kleines verständnis Problem mit Klassen und Objekten.

    Ich bin gerade dabei eine Adresseverwaltung zu schreiben.

    Also habe ich auch dementsprechen eine Klasse Adressen und mit ein paar Methoden wie hinzufügen(), ändern(), löschen(), alleAdressen_ermitteln().

    Beim Programmstart sollen alle Adressen ermittel werden. Also muss ich ja die Funktion alleAdressen_ermitteln() aufrufen.

    Und da sind wir auch schon bei meinem Problem.

    Ich wollte für jede Adresse ein Objekt öffnet, weil ich mich strickt an die OOP halten wollte.

    Das Problem in PHP ist ja, dass man eine Funktion mit einem Objket aufrufen muss. Da habe ich mir gedacht, dass kann es doch nicht sein, weil extra ein Objekt zu erzeugen, welches nur für den Aufruf einer einer Funktion da ist. Also beschloss ich eine statische Funktion Funktion zu schreiben (alleAdressen_ermitteln()), welche dann ohne ein Objekt aufgerufen werden kann. Und da bin ich auch schon bei meinem nächsten Problem. Ich benutze die ADODB und in den einzelnen Klassen verwende ich die Objektreferenz des Datenbankobjektes, mit dem ich die Datenbankverbindung herstelle. Das Datenbankobjekt wird im Constructor mit übergeben und und als Membervariabel in den einzelnen Klassen gespeichert. Nur in meiner statischen Funktion kann ich ja jetzt nicht mehr mit $this arbeiten, weil eine statische Funktion das nicht zulässt. Also habe ich das Datenbankobjekt als global gesetzt. Meine Frage ist jetzt, ob ich das so machen kann oder ob das nicht im Sinne der OOP ist, dass ich bei machen Funktionen die Referenz des Datenbankobjektes benutze und halt bei statischen Funktionen das globale Datenbankobjekt?

    Oder sehe ich das ganze völlig falsch, dass ich die statische Funktion in die Adressenklasse gepackt habe.

    Die Funktion alleAdressen_ermitteln() soll für jeden Adressedatensatz ein Objekt erzeugen (innerhalb der Klasse).

    Weil eigentlich sollen doch nur Funktionen in eine Klasse, die von den Objekten benutzt werden und auf die Attributwerte der einzelnen Objekte zugreifen?!

    Wäre echt super, wenn Ihr mir einen kleinen Tip geben könnten.

    Bin schon ein wenig durcheinander mit den ganze Kramm:-)

    Ich danke Euch schon mal im Voraus

    MFG Glombi

  • #2
    Mal davon abgesehen, dass dieser Beitrag wahrscheinlich besser im Brainstormingbereich aufgehoben ist, ein paar (hoffentlich) hilfreiche Tipps.

    Der Sinn von der OOP ist es eigentlich mit globale Variablen zu vermeiden. Eine Möglichkeit deines Problems ist es z.B. der Methode, die alle Adressen ausliest, eine Referenz der DB-Verbindung als Parameter zu übergeben:
    PHP-Code:
    class AdressManager
    {
        function &
    getAllAdresses(&$connection$sql=null)
        {
            
    $sql = ($sql === null) ? 'SELECT ...' $sql;
            
    $result $connection->query($sql);
            
    $adresses = array();
            
            foreach(
    $result as $adress) {
                
    $adresses[] = new Adress($connection$adress);
            }
            
            return 
    $adresses;
        }
    }

    class 
    Adress
    {
        var 
    $connection;
        
    // var ...
        
        
    function Adress(&$connection$data=null)
        {
            
    $this->connection =& $connection;
            if(
    $data !== null) {
                
    $this->import($data);
            }
        }

    Dabei muss bei jedem Aufruf von AdressManager::getAllAdresses() die Instanz mit übergeben werden. Das ist aber nicht so tragisch, da man wahrscheinlich eh nur einmal diese Methode aufruft. Diese gibt dann die Referenz an die Adressen weiter.

    Beispiel:
    PHP-Code:
    <?php

    $conn 
    = new ADODBCOnnectionOderWieDasAuchImmerHeisst();
    $adresses AdressManager::getAllAdresses($conn"SELECT * WHERE plz like '4%'");

    foreach(
    $adresses as $adress) {
        if(
    $adress->getName() == 'Müller') {
            
    $adress->delete();
        }
    }

    ?>
    Eine andere Möglichkeit wäre, die Klasse AdressManager nicht als statische zu verwenden, sondern als Singleton. Das heißt, dass von ihr nur eine Instant entstehen wird. Diese wird mittels einer Methode, z.B. getInstance() verwaltet. Dazu bekommt die Klasse noch eine setConnection() Methode um nach dem erstmaligen Aufruf von getInstance() die Verbindung zu setzen:
    PHP-Code:
    class AdressManager
    {
        var 
    $connection;
        
        function &
    getInstance()
        {
            static 
    $instance;
            
            if(!isset(
    $instance)) {
                
    $instance = new AdressManager();
            }
            
            return 
    $instance;
        }
        
        function 
    setConnection(&$connection)
        {
            
    $this->connection =& $connection
        
    }
        
        function &
    getAllAdresses($sql=null)
        {
            
    $sql = ($sql === null) ? 'SELECT ...' $sql;
            
    $result $this->connection->query();
            
    $adresses = array();
            
            foreach(
    $result as $adress) {
                
    $adresses[] = new Adress($this->connection$adress);
            }
            
            return 
    $adresses;
        }

    Verwendung:
    PHP-Code:
    $conn = new ADODBCOnnectionOderWieDasAuchImmerHeisst();
    $manager =& AdressManager::getInstance();
    $manager->setConnection($conn);

    $adresses $manager->getAllAdresses($conn"SELECT * WHERE plz like '4%'");

    foreach(
    $adresses as $adress) {
        if(
    $adress->getName() == 'Müller') {
            
    $adress->delete();
        }

    Hoffe, dass die Erklärung etwas hilfreich war.

    Kommentar

    Lädt...
    X