Bademeister: Objekte in einer Klasse erzeugen und deren Zugriff

Beitrag lesen

Hi Oliver.

Mal gerade ein paar Anregungen zu Deinem Code:

  

> public function createCollection($collection){  
> 	foreach($collection as $key => $value){  
> 		$this->object[$key] = $value;  
> 	}  
> }  

1.: Wieso nicht einfach "$this->object = $collection"?
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?

  

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

2.: In Wahrheit willst Du aber einen Operator nehmen statt zwei, wenn einer reicht: if ($objectNumber !== NULL)

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.

$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))

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.

${$x->getObject(2)}->setGender('männlich');
echo ${$x->getObject(2)}->getGender();

Lass um Gottes willen die variablen Variablen weg!

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?

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

Ich wollte es eigentlich soo machen. Funktioniert aber nicht.

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

  
Was ist wohl der Scope der hier angelegten Variablen?  
  
  
Wozu denn diese ganze Collection-Sache?  
  
  
Viele Grüße,  
der Bademeister