Oliver: Objekte in einer Klasse erzeugen und deren Zugriff

Beitrag lesen

Hallo Bademeister,

danke vorerst für deine Hinweise und die Fragen, die ich versuche hiermit zu beantworten.
Wie ich bereits in meinem Posting vorher schrieb, versuche ich gerade etwas oop in php.

Ich hole mal etwas weiter aus um das Vorhaben zu erklären.
Ich züchte zu Hause Kaninchen. :) Auch zum Eigenverzehr. Ich mögt mir das bitte Nachsehen.

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.

Das möchte ich gern mit oop realisieren.
Soweit richtig gedacht?

Wie erwähnt haben die Kaninchen keine Namen sondern nur Nummern (id in der DB).

Die Funktion

  
... CreateCollection(array(Kaninchen1,Kaninchen2) ...

soll die Menge an Kaninchen in meinem Besitz darstellen und Ihnen Namen geben über die ich dann mit der Klasse myAnimal die Eigenschaften zu den jeweiligen Tieren anlege. Es kommen und gehen ständig Tiere und kann im Quellcode so leider nicht schreiben:

  
$Kaninchen1 = new myAnimal;  
$Kaninchen2 = new myAnimal;  
$Kaninchen3 = new myAnimal;  
$Kaninchen4 = new myAnimal;  
$Kaninchen5 = new myAnimal;  

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.
Dafür gibts sicher eine Lösung.

Bisher dachte ich mir das so:
Die Collection sammelt die Objektnamen (Kaninchen1, Kaninchen+n) der Tiere.

  
$Kaninchen1 = new myAnimal;  
$Kaninchen1->setGender('weiblich');  
  
$Kaninchen2 = new myAnimal;  
$Kaninchen2->setGender('männlich');  

usw.

Bis hierher kannst du mir sicher folgen.
Hast du vielleicht für oben genanntes Problem einen Lösungsvorschlag?

1.: Wieso nicht einfach "$this->object = $collection"?

Na klar. Ist ja schon in Array. :) Und dann gleich ein Neues. Das ist Quatsch.

2.: Wieso soll das nicht der Konstruktor machen? (Das ist ne echte Frage - es könnte dafür u.U. Gründe geben. Mein Tipp ist aber, dass es keine gibt. Ein Hinweis darauf ist bereits der Name der Funktion - kreiert wird die Collection bereits dann, wenn das Objekt kreiert wird. Oder?

  
... __CONSTRUCT(){  
     bla blubber blub;  
}  

Habe ich verstanden kann man so machen. :)

public function getObject($objectNumber = NULL){
if(!$objectNumber == NULL){
return $this->object[$objectNumber];
}
else{
return $this->object;
}
}
}


>   
> 1.: Vorsicht: Dein Array Object kann einen Schlüssel 0 haben. Den willst Du wohl von null unterschieden, also `if (!$objectNumber === NULL)`{:.language-php}  
>   
> 2.: In Wahrheit willst Du aber einen Operator nehmen statt zwei, wenn einer reicht: `if ($objectNumber !== NULL)`{:.language-php}  
>   
> 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.  
  

> > $x = new myCollection;  
> > $x->createCollection(array(1,2,3,4,5,6,7,8));  
>   
> S.o. Warum nicht `$x = new myCollection(array(1,2,3,4,5,6,7,8))`{:.language-php}  
>   
  
Durchaus machbar. :)  
Wußte ich bereits und habs einfach nur umständlicher umgesetzt.  
  

> > foreach($x->getObject() as $k){  
> > 	${$k} = new myAnimal;  
> > }  
>   
> Was soll das? Warum willst Du außerhalb der Objektes Deine Animals anlegen? Und: Die Namen Deiner Variablen sind ungültig. Es gibt hier auch keinen guten Grund, variable Variablen anzulegen.  
  
Auch hier war ich erstaunt. Zulässige Variablen in php dürfen laut Doc ja nicht mit einer Zahl beginnen. Komischerweise ging es trotz allem.  
  

> > ${$x->getObject(2)}->setGender('männlich');  
> > echo ${$x->getObject(2)}->getGender();  
>   
> Lass um Gottes willen die variablen Variablen weg!  
  
Ich verstehe, aber mein eigentliches Problem findest du oben beschrieben. Deswegen die variablen Variablen. Ich finds auch nciht schön, nur habe ich bisher keine andere Lösung.  
  

> > Zu Erklärung.  
> > Die Größe des Arraya um mir eine Collection zu erzeugen ist variabel. Nun möchte ich mir zu der Collection die einzelnen Objekte erzeugen.  
>   
> Wozu ist denn diese Collection überhaupt da? Was soll sie können, was ein Array nicht kann?  
  
siehe oben.  
  

> > 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!  
  

> > Kann mir einer verraten wo ich den Denkfehler habe?  
> > So wie es jetzt oben zu sehen sieht der Quellcode aus und fnuktioniert auch.  
>   
> Dass das funktioniert - ich hab gerade mal getestet - hast Du wohl einem Bug zu verdanken. Deine Variablennamen sind ungültig. Du kriegst die Variablen auf diese Weise der variablen Referenzierung tatsächlich erstellt und auch ins $GLOBALS-Array rein, aber Du wirst nicht direkt auf sie zugreifen können, sondern nur wieder über diese Krücke. Schreibe die Dinger \*unbedingt\* in ein Array!  
  
Ein blindes Huhn findet auch mal einen BUG. :)  
  

> > Ich wollte es eigentlich soo machen. Funktioniert aber nicht.  
> >   
> > ~~~php
  

> > private function createObjects(){  
> > 	foreach(self::getObject() as $key){  
> > 		${$key} = new myAnimal;  
> 

Was ist wohl der Scope der hier angelegten Variablen?

Scope, verzeih mir bitte, das muss ich erstmal googlen.
Was ist das?

In der Hoffnung das alles etwas verständlicher war, hoffe ich nun auf einen Lösungsansatz.
Das muß doch irgendwie machbar sein.

Vielen Dank nochmals Bademeister,
MfG
Oliver