Array mit Objekten - OOP in php4 <=> php5

  • Themenstarter Themenstarter besi
  • Beginndatum Beginndatum
B

besi

Hallo zusammen folgender Codeschnipsel:

PHP:
	foreach($this->getFields() as $field){
		$field->setValue("Hallo");
	}

	print_r($this->getFields());

Ich habe eine Vaterklasse, welche mit getFields alle Felder liefert. Wenn ich jetzt alle Felder durchgehe und dann überall das Value des Feldes auf "Hallo" setze so klappt das mit php5 perfekt.

In php4 hingegen kann ich zwar mit setValue den Wert auf Hallo setzen. Doch wenn ich die Schleife verlasse dann steht in allen Feldern noch der Alte wert von vorin (Also nicht "hallo".

Ich denke es liegt daran, dass in php4 in der foreach schleife ein ganz neues Objekt erzeugt wird, dass dann nichts mehr mit den Objekten der Vaterklasse zu tun hat. Wenn ich innerhalb der Schleife $field->getValue() ausführe so liefert es den Wert "hallo". Ich wäre sehr froh über eine kleine Hilfestellung.
 
Hmmm. Sollte das bei einer Variable die auf ein Objekt zeigt nicht sowieso der Fall sein? Ich habe es so probiert:

PHP:
				foreach($this->getFields() as $field){
					$field2 = &$field;
					$field2->setValue($valueArray[$field->getName()]);
				}
Das hat aber leider auch nicht funktioniert...
 
Hi!
Das liegt daran, dass die getField methode standartmäßig kine Referenz zurückgibt, was manchmal zu komischen ergebnissen führt. Ab PHP5 werden objekte dann standartmäßig als Referenz behandelt.
Dazu gibt es 3 lösungswege:
1. Schon innerhalb von deinem Objekt mit Referenzen arbeiten
2. Nur die feldwerte zurückgeben: foreach($this->getFields() as $key) { $field = &$this->fields[$key]; }
3. Die Funktionsdeklaration als Referenz:
Code:
&function refFunc()
{
  static $foo = new StdClass();
  return &$foo;
}
var_dump(&refFunc());
Dazu siehe auch: http://de.php.net/manual/en/language.references.return.php
 
Danke für den Hinweis. Ich habe es jetzt folgendermassen gelöst:

PHP:
				for($i=0;$i< sizeof($this->getFields());$i++) { 
					$field = &$this->fields[$i];
					$field->setValue($valueArray[$field->getName()]);
				}
 
Zurück