Ankündigung

Einklappen
Keine Ankündigung bisher.

Extends oder Initialisierung in einer Variable ?

Einklappen

Neue Werbung 2019

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

  • Extends oder Initialisierung in einer Variable ?

    Hallo,

    Ich fasse mich kurz, wo ist der Unterschied zwischen folgenden Schema:

    PHP-Code:
    <?php
       
        
    /**
        * Klasse 1. Diese möchte ich in Klasse 2 und 3 benutzen
        */
        
    class foo
        
    {
            function 
    foo($ret false)
            {
                if (
    $ret) {
                    return 
    true;
                } else {
                    return 
    false;
                }
            }
        }

    ?>
    PHP-Code:
    <?php
       
        
    /**
        * Klasse 2. In dieser Klasse möchte ich Klasse
        * 1 benutzen
        */
        
    class bar
        
    {
            
    /**
            * Instanzierung der Klasse foo
            */
            
    var $foo;
            
            
    /**
            * Konstrucktor
            * Erwartet $class.
            * Das könnte so aussehen:
            *
            * $class = new foo();
            * $bar = new bar($class);
            *
            * ... Und schon haben wir foo in der Klasse bar zur Verfügung
            */
            
    function bar($class)
            {
                
    $this->foo $class;
            }
            
            
    /**
            * Irgendeine Funktion
            */
            
    function x()
            {
                if (
    $this->foo()) {
                    print (
    'Well done');
                } else {
                    return 
    false;
                }
            }
        }

    ?>
    PHP-Code:
    <?php
       
        
    /**
        * Klasse 3. In dieser Klasse möchte ich Klasse
        * 1 ebenfalls benutzen
        */
        
    class foobar extends foo
        
    {
            
    /**
            * Konstrucktor
            */
            
    function foobar()
            {
                if (
    $this->foo()) {
                    print (
    'Well done');
                } else {
                    return 
    false;
                }
            }
        }

    ?>
    Danke.


  • #2
    Aha. Sehr interessant...

    Was war jetzt nochmal deine Frage?

    Kommentar


    • #3
      Das eine ist Aggregation und das andere Vererbung.
      Zu beidem findet sich bei google jede Menge

      Kommentar


      • #4
        Mhh ich muss das nochmal hervorholen hier.

        Mir ist nicht ganz klar, wie ich verschiedene Klasse miteinander verbinden soll. Es gibt die Möglichkeit der Aggregation und die der Vererbung. (Global wäre wohl auch noch ne Möglichkeit)

        Aber was mache ich jetzt mit Klassen, die beispielsweise auf eine DB zugreifen. Das tun bei mir viele Klassen. Ich kann ja nun irgendwie nicht bei jeder extends MySQL dazu schreiben, das erscheint mir unprofessionell.

        Sollte ich in den Klassen gar auf andere Klassen wie die DB Klasse verzichten und alles manuell machen?

        Wäre irgendwie auch doof, da muss man immer erst kontrollieren ob ne Verbindung steht, ggf. nach Benutzerdaten fragen etc.

        Wie macht man das gewöhnlich? Oder ist der Weg der Aggregation schon der beste?

        Kommentar


        • #5
          Warum und in weldchem Rahmen greifen viele Klassen bei Dir auf die Datenbank zu?

          Erweitern sie Datenbankfunktionalität? Wenn nein (und davon gehe mal aus), kann man "extends" schonmal ausschließen. Sie werden die DAtenbankobjekte wohl eher als Datenquellen benutzen. Wann genau tun sie das?

          Kommentar


          • #6
            Sie werden die DAtenbankobjekte wohl eher als Datenquellen benutzen.
            Richtig.

            Sie tun das wenn ich irgendwelche Daten für eine Überprüfung o.ä. benötige.
            Inwiefern ist das wichtig?

            Kommentar


            • #7
              Es ist in soweit wichtig, als das die benötigte Bindungsstärke ber den Aufabu (mit-)entscheidet.
              Du kannst die Datenquelle sehr lose mit der Überprüfung koppeln, indem Du das Datenobjekt beim Methodenaufruf übergibst.
              Dein eines Objekt weiss, wo man die Daten herholt. Das andere weiss, wie man Daten überpüft. Und die implementierte Logik (ausserhalb dieser beiden Klassen) weiss, wie man beide über einen Methodenaufruf zusammenführt.

              Hängt halt noch etwas mehr als beschrieben von der Problemstellung ab.

              Kommentar


              • #8
                Hallo,

                Vererbung macht nur Sinn, wenn die Eltern-Klasse abstrakter (~gröber) ist. z.B. hast du eine Klasse Schauspieler, die von der Klasse Person erben kann. Die Klasse Schauspieler sollte aber nicht von der Klasse Datenbank erben, da eine Datenbank ja kein abstrakteres Model eines Schauspielers ist.
                Ich löse es momentan so, dass ich die Datenbank-Klasse per singleton (http://de.wikipedia.org/wiki/Singleton) in Manager-Klassen instanziere (z.B. ActorManager), welche die angeforderte Anzahl (z.B. eine Auflistung der Schauspieler für eine Seite) an Actor-Objekten instanziert, welche ich dann zur Ausgabe/Bearbeitung verwenden kann (die ManagerKlasseX ist also ein Verbindungsstück zwischen KlasseX und Datenbank).

                Vielleicht hilft dir das Schlagwort Entwurfsmuster für Google oder Wikipedia ja etwas weiter.

                Kommentar

                Lädt...
                X