| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

25-06-2011, 16:31
|
|
lx-club
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 825
|
|
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.
|

25-06-2011, 16:43
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
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:
Zitat von lx-club
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?
Geändert von h3ll (25-06-2011 um 16:49 Uhr)
|

25-06-2011, 16:51
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Die magische Variante:
Du könntest das ArrayAccess Interface implementieren.
|

25-06-2011, 16:52
|
|
lx-club
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 825
|
|
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
|

25-06-2011, 16:55
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
PHP-Code:
// magisch
if ($product->offsetExists('aircondition'))
tuwas();
Geändert von combie (25-06-2011 um 16:57 Uhr)
|

25-06-2011, 16:59
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.188
|
|
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 
|

25-06-2011, 17:00
|
|
lx-club
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 825
|
|
Zitat:
Zitat von h3ll
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:
Zitat von h3ll
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
|

25-06-2011, 17:04
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.188
|
|
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;
}
|

25-06-2011, 17:15
|
|
lx-club
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 825
|
|
Zitat:
Zitat von TobiaZ
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
Geändert von lx-club (25-06-2011 um 17:19 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|