Hi.
Das kleine Projekt soll mir helfen meine Kaninchen zu verwalten. Sind nun mal nicht nur 20 Stück.
Diese Kaninchen liegen mit diversen Daten(id, boxnr, geburtstag, usw.) in einer MySQL Datenbank.Jedes Kaninchen stellt für mich ein Objekt dar. Es kann _umziehen_ von Box 2 in die Box 5, durchaus auch mal krank sein oder eben tragend.
So. Hier erstmal kurz anhalten und ueberlegen:
Deine Kaninchen liegen in der Datenbank! Wenn Du jetzt wasAuchImmer mit den Kaninchen innerhalb Deines PHP-Skriptes machen willst, dann kriegt dieses Skript ALLE Informationen ueber den aktuellen Bestand der Kaninchen (Anzahl, Krankheiten, u.s.w.) aus der Datenbank. Wenn sich was aendert - neues Kaninchen geboren e.t.c. - dann fuehrt das NIE dazu, dass Du Deinen PHP-Code aendern musst. Wenn doch, dann weisst Du, dass Du etwas falsch gemacht hast.
Das möchte ich gern mit oop realisieren.
Soweit richtig gedacht?
Die Frage muss gestattet sein, WAS Du realisieren willst. Was Du wohl wirklich realisieren willst, ist ein Mechanismus, um die Daten Deiner Kaninchen a) zu lesen und b) zu aendern. Du solltest Dir aber im Klaren sein, dass das nur Einzelaktionen sind. Die Kaninchen leben in der Datenbank, nicht in irgendeinem PHP-Skript (ich haette nicht gedacht, dass ich diesen Satz jemals sagen wuerde ;-)).
Wie erwähnt haben die Kaninchen keine Namen sondern nur Nummern (id in der DB).
Das wirkte im ersten Moment etwas herzlos auf mich, ist aber wahrscheinlich besser, wenn man sie spaeter noch essen will!? ;-)
Die Funktion
... CreateCollection(array(Kaninchen1,Kaninchen2) ...
> soll die Menge an Kaninchen in meinem Besitz darstellen und Ihnen Namen
Das ist kein guter Ansatz. Wie oben bereits gesagt: Wie viele Kaninchen Du hast, weiss die Datenbank! Sonst niemand! Dein Objekt soll eine Liste mit allen Kaninchen repraesentieren. Daher sollte es bei seiner Erstellung (also im Konstruktor) die Datenbank fragen, welche Kaninchen zur Zeit da sind:
~~~php
class MyRabbits {
protected $rabbit = array();
public function __construct() {
- stelle Verbindung zur Datanbank her
- hole per Query alle Kaninchen aus der Datenbank
- fuer jedes Kaninchen:
$this->rabbit[ID des Kaninchens] = new MyAnimal(aktuelles Kaninchen)
}
public function getRabbit($index) {
return $this->rabbit[$index]; // Achtung: [link:http://en.wikipedia.org/wiki/Garbage_In,_Garbage_Out@title=GIGO]
}
public function getRabbits {
return $this->rabbit;
}
}
Es könnten durchaus mal 20 Stück sein oder 50. Ich will dafür nicht immer im Code rumschreiben. So solls ja auch nicht sein.
Eben.
$Kaninchen1 = new myAnimal;
$Kaninchen1->setGender('weiblich');$Kaninchen2 = new myAnimal;
$Kaninchen2->setGender('männlich');
1\.: Nein, nein, nein! Die Kaninchen stehen in einem Array \*in\* dem Objekt, nicht irgendwo als globale Variablen im Skript.
2\.: Sollte das gar nicht mehr noetig sein, weil das Geschlecht des Kaninchens beim Anlegen des Kaninchenobjektes bereits gesetzt wurde: Der Konstruktor der Collection hat beim Auslesen des Kninchens aus der Datenbank das Geschlecht bereits gelesen und gesetzt. Von Hand setzen willst Du es evtl. dann, wenn Du (z.B. durch Auswertung eins Formulares) ein neues Kaninchen erzeugen willst, das gerade geboren wurde, und in die Datenbank eintragen. Das ist aber eh noch ne andere Baustelle.
Und: Es ist ratsam, fuer das Geschlecht (maennlich, weiblich) nicht Strings zu verwenden, sondern Konstanten anzulegen, mit etwa den Werten 0 und 1.
> > 3.: Es ist selten ratsam, dass eine Funktion Rückgabewerte verschiedener Variablentypen erlaubt (zumindest solche, die sich nicht auf "natürliche Weise" per impliziter Typumwandlung vereinbaren lassen). Willst Du wirklich, dass eine Funktion, die getObject heißt, u.U. das ganze Array zurückgibt? Ich würde dafüer eine eigene Funktion vorsehen.
>
> Es war vorgesehen, das ich uU. ein Objekt benötige oder gar alle in einem Ritt. Für mehr sollte das nicht dienen.
Fuer diesen Fall habe ich ja nur empfohlen (und tue das nochmal), dafuer eine eigene Funktion bereitzustellen, deren Funktionsnamen man ansieht, dass sie dazu da ist, das ganze Array zu liefern.
Allerdings: Da das ganze Objekt "Collection" dazu da ist, das Array mit Deinen Kaninchen zu repraesentieren, waere (als etwas ambitionierteres Ziel) evtl. eine Implementierung von [ArrayAccess](http://uk.php.net/manual/en/class.arrayaccess.php) ratsam, so dass Du direkt per Array-Syntax auf die Kaninchen zugreifen kannst.
> > > Ich wollte die Objekte eigentlich gleich in der Klasse myCollection erzeugen. Habe dann aber anschließend im Script keinen Zugriff auf das Objekt, da es scheinbar nicht vorhanden ist.
> >
> > ?? Und unscheinbar?
>
> Kann dir nicht folgen!
Natuerlich hast Du Zugriff auf sie, wenn sie als Variablen in dem Objekt vorhanden und "public" sind. Allerdings solltest Du Dich entscheiden, ob Du sie "public" machst, oder ob Du, wie geschehen, eine Funktion anbietest, die sie zurueckliefert. Beides brauchst Du nicht.
> In der Hoffnung das alles etwas verständlicher war, hoffe ich nun auf einen Lösungsansatz.
S.o.
Viele Gruesse,
der Bademeister