php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
dynamische Klasseneigenschaften


 
lx-club
25-06-2011, 16:31 
 
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:


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.

 
h3ll
25-06-2011, 16:43 
 
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.

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?

 
combie
25-06-2011, 16:51 
 
Die magische Variante:
Du könntest das ArrayAccess Interface implementieren.

 
lx-club
25-06-2011, 16:52 
 
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

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

 
combie
25-06-2011, 16:55 
 
// magisch
if ($product->offsetExists('aircondition'))
tuwas();

 
TobiaZ
25-06-2011, 16:59 
 
was spricht gegen

if($product['aircondition'])

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

 
lx-club
25-06-2011, 17:00 
 
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.



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

 
TobiaZ
25-06-2011, 17:04 
 
BTW: Dein Titel nennt sich "dynamische Klasseneigenschaften". Das sähe dann so aus:


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

 
lx-club
25-06-2011, 17:15 
 
BTW: Dein Titel nennt sich "dynamische Klasseneigenschaften". Das sähe dann so aus:


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


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


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:21 Uhr.