php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.05.2009, 12:32  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard Klasse für Objekteigenschaft erzeugen?

Hallo liebe Leute,

ich stelle mir häufig die Frage ob ich eine Klasse für etwas erstellen soll, das eigentlich eine Eigenschaft eines anderen Objekts ist.

Und zwar habe ich z.B. folgende Klasse:

PHP-Code:
abstract class Tree {
  protected 
$db;
  protected 
$tree_id;

  private 
$cache = array();

  public function 
__construct($db$tree_id) {
    if (
$db instanceof Database) {
      
$this->db $db;
    }

    
$this->tree_id $tree_id;
  }

  
//etc.

Die Eigenschaften der Objekte dieser Klasse lese ich folgendermaßen aus der Datenbank aus (diese Methode befindet sich in der Klasse "Tree" s.o.):
PHP-Code:
public function __get($name) {
    if (!isset(
$this->cache[$name])) {
      
$this->db->query("SELECT
                             `" 
$name "`
                       FROM
                             `" 
Database::TBL_PREFIX "trees`
                       WHERE
                             `id` = '" 
$this->tree_id "'
                       LIMIT 1
      "
);

      
$row $this->db->fetch_array();

      
$this->cache[$name] = $row[$name];
    }

    return 
$this->cache[$name];
  } 
So, schön und gut! Eine Eigenschaft der Objekte dieser Klasse ist z.B. die "Struktur":

- Horizontaler Baum
oder
- Vertikaler Baum

Die damit verbundene Frage tritt nun im Zusammenhang mit einem Formular auf! Ich würde gerne eine Select-Box für diese Eigentschaft "Struktur" anlegen, damit ich die Struktur des Baumes später ändern kann! Dazu besitzt die Klasse "Tree" aktuell foglende Funktion:
PHP-Code:
public function prepare_tree_structures() {
    
$structures = array();

    
$this->db->query("SELECT
                            `id`
                      FROM
                            `" 
Database::TBL_PREFIX "structures`
    "
);

    while (
$row $this->db->fetch_array()) {
      
$structures[] = $row["id"];
    }
    
    return 
$structures;
  } 
Die Selectbox innerhalb des Formulars wird dann so erstellt:
PHP-Code:
<select name="structure">
             <?php
             
foreach ($tree->prepare_tree_structures() as $structure_id) {
               
//hier wird dann ein Objekt der Klasse "Structure" erstellt
               
$structure = new Structure($db$structure_id);
               if (
$tree->structures_id == $structure_id) {
                 echo 
'<option value="' $structure_id '" selected>' $structure->name '</option>';
               } else {
                 echo 
'<option value="' $structure_id '">' $structure->name '</option>';
               }
             }
             
?>
           </select>
Meine Frage: Ist es sinnvoll oder überhaupt logisch, sprich hat das noch etwas mit OOP zu tun, wenn ich für die Eigenschaft "Struktur" ein Objekt der Klasse "Structure" erzeuge, mit dessen Hilfe ich dann den Namen der "Struktur" des Baumes auslese?

Gehört die Funktion prepare_tree_structures() überhaupt in die Klasse "Tree", weil eigentlich haben die Informationen die ich dort auslese selbst nichts mit dem Baum zu tun! Wo könnte ich diese Funktion besser unterbringen? Einfach als Funktion ohne Klassenzugehörigkeit?
Asipak ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 26.05.2009, 18:01  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Zitat:
Zitat von Asipak Beitrag anzeigen
ich stelle mir häufig die Frage ob ich eine Klasse für etwas erstellen soll, das eigentlich eine Eigenschaft eines anderen Objekts ist.
Jup, das gibt es häufig. In PHP hast du dann oft mehrere Pfeile hintereinander
$obj1->subobj->method();

Deine Idee speziell läuft auf folgendes Entwurfsmuster hinaus:
http://de.wikipedia.org/wiki/Kompositum_(Entwurfsmuster)
und ist damit klar OOP.
Die Frage bleibt, ob das wirklich der richtige Ansatz ist. Ich habe noch nicht verstanden, was du genau vor hast, daher kann ich dir das nicht bestätigen.

Was überdenken solltest ist die DB Abfrage in __get. Das ist sehr unperformant. Zumindest solltest du gleich alle Eigenschaften laden, zudem sollte das besser gesichert werden (zB dass man es keinen SQL Error gibt, wenn man versucht eine Eigenschaft anzusprechen, die nicht in der Tabelle existiert... Vielleicht benutzt du auch einfach gleich einen OR-Mapper, das ist vielleicht einfacher.

@Mod: Eher Fortgeschritten oder gar Softwaredesign oder?
__________________
Phoscur ist offline   Mit Zitat antworten
Alt 26.05.2009, 18:10  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Mir fehlt gerade die Geduld, mich da näher einzulesen. Aber bei Tree und variabler Ansicht fällt mir das Bridge-Pattern ein.

[MOD: verschoben]
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 26.05.2009, 19:59  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Hmm,

danke erst einmal für die Antworten. Design Pattern sind mir ein Begriff, habe mich aber noch nicht damit befasst, werde mich daher erst einmal darin einarbeiten. Ich habe nämlich das Gefühl, dass mein Problem ein Designproblem ist, da ich momentan einfach mit dem Aufbau der Klassen durcheinander komme. Ständig schiebe ich irgendwelche Methode und Eigenschaften hin und her!

Zitat:
Ich habe noch nicht verstanden, was du genau vor hast, daher kann ich dir das nicht bestätigen.
Die Klasse "Tree", vielmehr eine abgeleitete Klasse - die Klasse "MyTree" - nutze ich zur Erstellung von Baumdiagrammen mit der GD-Bibliothek.

Unter Baumdiagramme könnt ihr euch ein paar Beispiel-"Bäume" anschauen!

Die ersten 3 Beispiele sind Bäume die ich bereits mit dieser Klasse erstellen kann, den 4. Baum habe ich bearbeitet um zu zeigen, dass die Struktur der Bäume möglichst variabel sein soll, sprich später möchte ich weitere Strukturen hinzufügen! Für jede Struktur habe ich aktuell eine Klasse, die von der Klasse "MyTree" Eigenschaften wie z.B. Grafikbreite und die Image-ResourceID erbt. Ich müsste also für jede Struktur eine neue Klasse erstellen. Ist dies sinnvoll?

Was alle Bäume jeder möglichen Struktur gemeinsam haben sind natürlich die Äste (oder Blätter). Diese sollen einfach nur neu angeordnet werden, was ich ja über die abgeleiteten Klassen mache, die von der Klasse "MyTree" erben!

Das gefällt mir eigentlich auch so ganz gut, nur dann ist das Problem aufgetaucht, dass ich ja bestimmte Eigenschaften der einzelnen Äste für eine Struktur brauche, diese für die andere Struktur jedoch irrelevant sind! Bei dieser Struktur: http://www.php4yourself.de/tree/tree_3.png lege ich z.B. fest, in welchem Abstand die einzelnen Blätter an einem Ast angeordnet sind (siehe Blätter von "branch1"). Diese Information brauche ich bei dieser Struktur http://www.php4yourself.de/tree/tree_2.png jedoch nicht, weshalb auch die Formulare zur Bearbeitung der Baumeigenschaften unterschiedlich ausfallen.

Meine bisherige Lösung: Für jede Baumstruktur eine include-Datei erstellen, die sich im Ordner
PHP-Code:
$dir md5($tree->structures_id) . '/'
befindet und dort das Formular und Code zum Auslesen der "wichtigen" Eigenschaften speichern.

Ich meine, so kann es ja gehen. Nur ob das so sinnvoll ist?!?!!?

Wie gesagt, ich werde mich dann erst einmal mit Entwurfmustern etc. auseinander setzen. Könnt ihr mir ein Buch dazu empfehlen, wo die Techniken vertieft werden? Ich besitze zwar eins zu PHP 5 und Objektorientierter Programmierung, jedoch werden Entwurfsmuster auf nur knapp 50 Seiten behandelt, was mir jetzt beim Überfliegen erst einmal dürftig erscheint. Da geht doch noch mehr oder?

Zitat:
Was überdenken solltest ist die DB Abfrage in __get. Das ist sehr unperformant.
Da hast du recht, darüber habe ich an dieser Stelle gar nicht nachgedacht. Für jede Eigenschaft müsste dann ja ein Query gesendet werden! oO

Bin für weitere Ideen zur Verbesserung dankbar.
Asipak ist offline   Mit Zitat antworten
Alt 26.05.2009, 20:13  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Grundlegender Ansatz:

1/ Datenmodell des Baums erstellen, Teilstrukturen als Kompositionsmuster
2/ Mindestens ein zweites Objekt erstellen, das Anmutung und nötige Eigenschaften des Baumes bestimmt/vorhält, Methoden zur Ausgabe bereitstellt.

Die Verbindung zwischen beiden Objekten kann verschieden erfolgen:
- 2/ wird von 1/ abgeleitet
- 2/ dekoriert 1/ (bspw. Decorator-Pattern)
- ein drittes Objekt bindet beide Objekte ein und/oder erzeugt 2/ dynamisch
- 1/ und 2/ bilden ein Bridge-Pattern ...

Alles eine Frage, ob die View des Baumes auf verschiedene Eigenschaften abgebildet/reduziert werden kann oder ob sich die Bäume auch in anderen Dingen unterscheiden.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 26.05.2009, 20:23  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Nett

Dafür dass ich mir unter "dekorieren" irgendwas in Richtung: "mit Filzern bemalen oder einen Kuchen mit Raspelschokolade verzieren" vorstelle glaube ich dennoch zu glauben das ich verstehe was du mir sagen willst!

Jedenfalls weiß ich das ich erst einmal einiges dazu lesen muss, um herauszubekommen wie 1/ und 2/ aufgebaut sein müssen (du sagst es ja eigentlich nur kann ich damit noch nicht viel anfangen). Werde mich dabei auf jedenfall mal an deiner Antwort orientieren.

Danke soweit, melde mich wenn es etwas Neues gibt!
Asipak ist offline   Mit Zitat antworten
Alt 26.05.2009, 20:56  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Die helfen schon mal:

Entwurfsmuster – Wikipedia
design:decorator_pattern [phpPatterns]
design:the_decorator_pattern_redecorated [phpPatterns]
http://books.google.de/books?id=xJ30...esign+Patterns
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 26.05.2009, 21:09  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Also so ganz verstehe ich dich nicht.
Zunächst solltest du dir überlegen, ob Vererbung wirklich notwendig ist, oder ob es nicht besser wäre, die von php4yourself bereitgestellt Klasse als Objekteigenschaft zu nutzen. Damit bist du flexibler, da du beispielsweise diese Klasse später durch eine andere ersetzen könntest, die das ganze beispielsweise in SVG rendert. Hättest du das jetzt vor, wäre deine bisherige Klasse weitestgehend unbrauchbar dafür.
Versuch also möglichst auf Vererbung zu verzichten.

Zitat:
Das gefällt mir eigentlich auch so ganz gut, nur dann ist das Problem aufgetaucht, dass ich ja bestimmte Eigenschaften der einzelnen Äste für eine Struktur brauche, diese für die andere Struktur jedoch irrelevant sind!
Dann musst du neue Objekte oder variable Eigenschaften einführen. Sprich Klasse TreeVertical, TreeHorizontal, die von einem Tree erben, der die gemeinsamen Objekteigenschaften hält (die Instanz könntest du per Factory erzeugen) oder speicherst Objekteigenschaften nicht direkt ab, sondern in einer Objekteigenschaft selbst, ala protected $_properties = array();

Wenn du extrem viele Eigenschaften oder sogar Objekte des selben Typs hast, kannst du das Fliegengewicht/Flyweight-Pattern verwenden. Hierbei wird versucht statt Duplikaten Referenzen auf ein Uniqueobjekt zu verwenden.

Sprich:
$icon = new Icon("folder.png");
$folder1 = new Folder("/xy");
$folder1->setIcon($icon);
$folder2 = new Folder("/yz");
$folder2->setIcon($icon);

Flyweight – Wikipedia

Das hätte dann den Vorteil, dass bei der Darstellung eines riesigen Baumes (deiner Festplatte?) nicht genausoviel Icons wie Verzeichnisse erzeugt werden, sondern nur genau einer.
(die Anwendung wie in meinem Beispiel oben ist natürlich etwas anders).
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 27.05.2009, 00:52  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

OOP bei PHP ist so ne Sache...
Ich hab' oft das Gefühl viele programmieren eher "pseudo" OOP, also mit Klassen und Objekten, aber eigentlich gar nicht mit der wirklichen OOP Philosophie... Mit Design Patterns bist du auf dem richtigen Weg. Ich musste allerdings feststellen, dass dieser - zumindest für mich - weit schwieriger ist als überhaupt Programmieren zu lernen. Vor allem weil man erstmal wieder feststellen muss, dass man docht nichts kann, obwohl man doch relativ sicher in der Syntax geworden ist..
Mach dich also auf etwas gefasst, Design Patterns sind nicht ohne!
__________________
Phoscur ist offline   Mit Zitat antworten
Alt 27.05.2009, 01:00  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ja, das stimmt. Liegt imho aber auch daran, dass

- DP. eben theoretische Konstrukte sind, die
-- nicht immer 100%ig auf ein Problem passen (vielleicht auch müssen)
-- tw. nicht direkt auf PHP zugeschnitten sind

- Die Theorie von DP. in vielen Quellen nur immer wiedergekäut wird,
-- ohne einmal auf den theoretischen Überbau zu verzichten (man koennte Pattern auch durchaus praktischer erklären)
-- indem dabei oft auf verwandte Pattern verwiesen wird, statt das Prinzip direkt zu erklären

- Die Theorie von DP. fast ausschliesslich anhand von UML-Diagrammen kommuniziert wird
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Eine klasse einbinden newWorldOrder PHP Tipps 2009 2 23.02.2009 19:32
[Erledigt] Klasse in anderer Klasse benutzen Screeze PHP Tipps 2009 2 04.01.2009 14:57
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
Klasse aus externer Klasse aufrufen kostja PHP Tipps 2008 8 07.08.2008 14:13
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
Tool um (Spiel)Klassen zu erzeugen Martin13 PHP-Fortgeschrittene 6 05.09.2007 02:25
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
[Erledigt] Führerschein für Klasse A+B.. Preis OK??? Off-Topic Diskussionen 20 13.07.2005 18:44
Rückgabewert auf einer Klasse anders als in der Klasse micbur PHP Tipps 2005-2 6 10.06.2005 15:06
[Erledigt] Problem mit Übergabe einer Klasse in PHP4 PHP-Fortgeschrittene 10 08.01.2005 21:00
Klasse holt sich die Klasse PHP-Fortgeschrittene 9 07.10.2004 11:53
[Erledigt] Brauche Hilfe bei meiner ersten Klasse PHP-Fortgeschrittene 9 24.09.2004 17:09
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php objekteigenschaften, php array in eigenschafen, pfeil php object variable, php objekt in klasse erzeugen, php objekt neue eigenschaft, php objekt ohne klasse erstellen, gemeinsame objekteigenschaft, php mehrere pfeile objekte, php klasse aus datenbank erstellen, php methoden erstellen, klasse in klasse erzeugen php, php objekt generieren db, php objekt aus klasse erzeugen, php objet mehrere pfeile, php name der verbundenen db herausfinden, klasse mit eigenschaften erstellen php, objekt einer anderen php datei erzeugen, objekt eigenschaft klasse datenbank, php eigenschaft erzeugen, neue eigentschaft in object anlegen php

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




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum