dynamische Klasseneigenschaften

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

  • dynamische Klasseneigenschaften

    Hi,

    meine Datenbank ist so aufgebaut, das man jederzeit einem Produkt weitere Eigenschaften zuordnen kann, ohne an der Struktur was zu ändern.

    Ich würde das gern in eine Klasse übertragen. Wird eine neue Eigenschaft hinugefügt, will ich aber nicht jedesmal die Klasse erweitern:

    PHP-Code:
    public function getProperty($name){
      return 
    $this->$name;

    Es gibt aber auch viele Eigenschaften, wo jeweils nur ein boolean zurückgegeben wird. Dann sollte die Bezeichnung nicht getProperty sondern hasProperty sein. Gibt es dafür eine Lösung, also dynamisch Attribute der Klasse hinzuzufügen und jeweils andere Mehodenbezeichnungen zu verwenden?

    Mein erster Gedanke war, einfach analog zu getProperty eine weitere Methode hasProperty anzulegen und dann (z.B. bei der Ausgabe der Werte ) einfach die eine oder andere Methode zu verwenden?

    Farbe --> getProperty('color');
    Klimaanlage --> hasProperty('aircondition');

    wobei man jeden Wert auch mit der jeweils anderen Funktion bekommen könnte.

    Oder ist es generell besser, wirklich für jede Eigenschaft eine Methode zu haben? Beim Hinzufügen von neuen Eigenschaften muss mann dann die Klasse anpassen. Mein obiges Problem würde dann nicht mehr bestehen.

  • #2
    Die Sache ist, dass zu viel "Magie" den Code schwer verständlich macht und zu manch Überraschungen führt. Außerdem unterstützen IDEs keine magischen Methoden/Eigenschaften beim Autocomplete, wodurch natürlich auch ein gewisser Komfort für den Programmierer verloren geht.

    Außerdem spricht dies nicht gerade für dein Datenbankdesign, wenn eine Änderung der Daten auch eine Code-Änderung erfordert. Normalerweise sollte der Code selber von den Daten unabhängig sein.

    Dein Ansatz mit ->getProperty($property) und ->hasProperty($property) sieht vernünftig aus, aber ich verstehe nicht, warum du für jeden Wert eine andere Funktion benötigst? Woher kommen die Properties überhaupt? Sind die dynamisch oder statisch? Wenn sie statisch sind, mach doch auch explizit Funktionen dafür.

    Zitat von lx-club Beitrag anzeigen
    Oder ist es generell besser, wirklich für jede Eigenschaft eine Methode zu haben? Beim Hinzufügen von neuen Eigenschaften muss mann dann die Klasse anpassen. Mein obiges Problem würde dann nicht mehr bestehen.
    Wo ist das Problem? So oft sollte die Datenbankstruktur nicht geändert werden, dass dies zu einer großen Arbeit wird. Warum tut dir das weh, wenn du (Hausnummer) einmal im Monat eine Klasse anpasst?
    Zuletzt geändert von h3ll; 25.06.2011, 16:49.

    Kommentar


    • #3
      Die magische Variante:
      Du könntest das ArrayAccess Interface implementieren.
      Wir werden alle sterben

      Kommentar


      • #4
        Hi,

        ich hatte mir zum Design hier im Forum auch etws Rat geholt und da auch super Hilfe bekommen. Das Design der DB ist schon ok:

        produkte:
        - id
        - name

        eigenschaft:
        - id
        - name

        wert:
        - produkt_id
        - eigenschaft_id
        - wert

        Somit kann ich ja ganz flexibel neue Eigenschaften hinzufügen.

        Ich möchte eigentlich nur verschiedene Bezeichnungen nutzen, um den Code verständlich und lesbar zu machen. Es ist doch besser
        PHP-Code:
        if ($product->hasProperty('aircondition'))

        als

        if ($product->getProperty('aircondition')) 
        zu schreiben, finde ich. has / is jeweils für Methoden, die einen boolean zurückgeben, ansonsten get

        Kommentar


        • #5
          PHP-Code:
          // magisch 
          if ($product->offsetExists('aircondition'))
            
          tuwas(); 
          Zuletzt geändert von combie; 25.06.2011, 16:57.
          Wir werden alle sterben

          Kommentar


          • #6
            was spricht gegen

            PHP-Code:
            if($product['aircondition']) 
            EDIT:
            isset ist glaube ich an der stelle falsch, der wert kann ja auch false sein, wo isset aber immernoch true liefern würde.
            Also
            PHP-Code:
            if(isset($product['aircondition']) && $product['aircondition']) 


            EDIT:
            okay, isset wurde schonwieder weggenommen

            Kommentar


            • #7
              Zitat von h3ll Beitrag anzeigen
              Woher kommen die Properties überhaupt? Sind die dynamisch oder statisch? Wenn sie statisch sind, mach doch auch explizit Funktionen dafür.
              Ich mache eine DB-Abfrage und dann wird ein Array erstellt, was an die Klasse übergeben wird.

              Zitat von h3ll Beitrag anzeigen

              Wo ist das Problem? So oft sollte die Datenbankstruktur nicht geändert werden, dass dies zu einer großen Arbeit wird. Warum tut dir das weh, wenn du (Hausnummer) einmal im Monat eine Klasse anpasst?
              Es ist ja eigenltich kein richtiges Problem, nur wollte ich noch sowas in der Art machen, das man ein Formular hat und jeweils neue Eigenschaften dort hinzufügt. Dann steht diese in der DB, aber ich muss auch in der Klasse die entsprechenden Eigenschaften setzen

              Kommentar


              • #8
                BTW: Dein Titel nennt sich "dynamische Klasseneigenschaften". Das sähe dann so aus:

                PHP-Code:
                function konstruktor(array $properties)
                {
                  foreach(
                $properties as $p => $v)
                    
                $this->$p $v;

                Kommentar


                • #9
                  Zitat von TobiaZ Beitrag anzeigen
                  BTW: Dein Titel nennt sich "dynamische Klasseneigenschaften". Das sähe dann so aus:

                  PHP-Code:
                  function konstruktor(array $properties)
                  {
                    foreach(
                  $properties as $p => $v)
                      
                  $this->$p $v;

                  Hatte ich so genannt, da ich ja nicht jede neue Eigenschaft extra aufschreiben wollte. So ähnlich habe ich es jetzt auch, wie im Codebeispiel

                  PHP-Code:
                  function konstruktor(array $properties)
                  {
                    foreach(
                  $properties as $p => $v)
                      
                  $this->setProperty($p,$v);

                  So kann man einfach neue Eigenschaften hinzufügen, ohne an der Klasse was zu ändern.

                  Zur besseren Lesbarkeit wollte ich halt bei Methoden die nur einen boolean zurückgeben einfach hasProperty schreiben, sonst getProperty. DEswegne wolltei ch beide Methodne anlegen und im Tempate jeweils die geeignete nehmen
                  Zuletzt geändert von lx-club; 25.06.2011, 17:19.

                  Kommentar

                  Lädt...
                  X