foreach() in php5

Hallo,

von PHP4 war mir bekannt, dass foreach() immer Kopien eines Arrays
erzeugte, wenn man es durchlief:

$daten = array (....);

foreach ($daten as $data) {
$data = .... ; }

ließ also das die Ursprungsdaten unberührt, und man musste sich so
behelfen:

foreach ($daten as $key=>data) {
$daten[$key] = ... ; }


Wie ist das in PHP5, speziell wenn ich Objekte durchlaufe? Werden immer
noch Kopien erzeugt oder nur Referenzen / Pointer auf die Objekte?

Servus,
Konni

--
Inzwischen ohne Signatur
kscheller [ Mi, 09 Januar 2008 11:21 ] [ ID #1903822 ]

Re: foreach() in php5

(Konni Scheller) wrote:
>von PHP4 war mir bekannt, dass foreach() immer Kopien eines Arrays
>erzeugte, wenn man es durchlief:
> [...]
>Wie ist das in PHP5, speziell wenn ich Objekte durchlaufe? Werden immer
>noch Kopien erzeugt oder nur Referenzen / Pointer auf die Objekte?

Weder noch. Es werden Kopien oder Referenzen der (öffentlichen)
Objektvariablen erzeugt. Falls Du die nicht auf Kopien arbeiten
willst, sondern die Werte der Objektvariablen verändern möchtest,
stelle das Referenzzeichen & voran:

class A
{
public $c;
}

$a = new A();

foreach ($a as &$var)
{
$var = 0;
}

Schöne Grüße, Steffen
steffen bruentjen [ Mi, 09 Januar 2008 11:44 ] [ ID #1903824 ]

Re: foreach() in php5

..oO(Konni Scheller)

>von PHP4 war mir bekannt, dass foreach() immer Kopien eines Arrays
>erzeugte, wenn man es durchlief:
>
>$daten = array (....);
>
>foreach ($daten as $data) {
> $data = .... ; }
>
>ließ also das die Ursprungsdaten unberührt, und man musste sich so
>behelfen:
>
>foreach ($daten as $key=>data) {
> $daten[$key] = ... ; }
>
>
>Wie ist das in PHP5, speziell wenn ich Objekte durchlaufe? Werden immer
>noch Kopien erzeugt oder nur Referenzen / Pointer auf die Objekte?

Willst Du das Objekt selbst durchlaufen (also dessen Eigenschaften) oder
aber ein Array von Objekten? In letzterem Fall werden noch immer Kopien
angelegt, allerdings nicht von den Objekten selbst, sondern nur von
deren internen Handles. Man kann also innerhalb der Schleife direkt auf
die Objekte zugreifen und diese modifizieren, ohne mit Referenzen oder
Indizes hantieren zu müssen.

Micha
Michael Fesser [ Mi, 09 Januar 2008 11:57 ] [ ID #1903826 ]

Re: foreach() in php5

Michael Fesser <netizen [at] gmx.de> wrote:

> Willst Du das Objekt selbst durchlaufen (also dessen Eigenschaften) oder
> aber ein Array von Objekten?

Konkret gibt es einen CompositeIterator, der die für foreach()
notwendigen methoden implementiert.

Unter anderem deswegen ist dann der key nicht definiert.

Servus,
Konni



--
Inzwischen ohne Signatur
kscheller [ Mi, 09 Januar 2008 14:03 ] [ ID #1903828 ]

Re: foreach() in php5

Konni Scheller schrieb:
> von PHP4 war mir bekannt, dass foreach() immer Kopien eines Arrays
> erzeugte, wenn man es durchlief:
>
> $daten = array (....);
>
> foreach ($daten as $data) {
> $data = .... ; }
>
> ließ also das die Ursprungsdaten unberührt, und man musste sich so
> behelfen:
>
> foreach ($daten as $key=>data) {
> $daten[$key] = ... ; }
>
>
> Wie ist das in PHP5, speziell wenn ich Objekte durchlaufe? Werden immer
> noch Kopien erzeugt oder nur Referenzen / Pointer auf die Objekte?

genau wie bei allem anderen. Es wird immer eine Kopie angelegt von der
Variable, allerdings ist die Variable im Falle eines Objektes eine
Referenz auf das Objekt selbst.

Daher rufst Methoden des Objektes auf, änderst damit auch das Objekt des
Originals. Weißt der Variable einen anderen Wert zu, änderst du nur die
Kopie und machst nicht das Objekt "kaputt".

foreach($array as $object)
{
$object->methode();
}

Machst das ganze per Referenz, machst das Objekt außerhalb auch "kaputt"
wenn neue Werte zuweisst, das ist der einzige Unterschied (mir bekannter
Art).

foreach($array as &$object)
{
$object = 5;
}
//Danach sind alle Objekte im Array auf einmal Integer mit dem Wert 5

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mi, 09 Januar 2008 15:31 ] [ ID #1903829 ]

Re: foreach() in php5

Christoph Herrmann schrieb:
> Daher rufst Methoden des Objektes auf, änderst damit auch das Objekt des
> Originals. Weißt der Variable einen anderen Wert zu, änderst du nur die
> Kopie und machst nicht das Objekt "kaputt".
>
> foreach($array as $object)
> {
> $object->methode();
> }
Aber auch:

foreach($array as $object) {
$object->name = 'foobar';
}

Hier wird das Objekt ebenfalls "kaputt gemacht". Nur zur Ergänzung :)

ciao

Ulf
Ulf Seltmann [ Do, 10 Januar 2008 16:38 ] [ ID #1904829 ]

Re: foreach() in php5

Ulf Seltmann schrieb:
> Aber auch:
>
> foreach($array as $object) {
> $object->name = 'foobar';
> }
>
> Hier wird das Objekt ebenfalls "kaputt gemacht". Nur zur Ergänzung :)

Nein, es wird normal auf das Objekt zugegriffen beidem der Status des
originale Objekts geändert werden kann genau wie bei den Methoden. Das
Objekt außerhalb der Schleife bleibt aber trotzdem noch ein Objekt der
Klasse. Ob der geänderte Status nun das Objekt kaputt gemacht hat oder
nicht liegt am Verhalten des Objektes selbst. "Gute" Objekte sollten
sich nicht in einen kaputten Status bringen lassen.

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Do, 10 Januar 2008 16:43 ] [ ID #1904832 ]
PHP » de.comp.lang.php.misc » foreach() in php5

Vorheriges Thema: Probleme mit Variablenvariablen
Nächstes Thema: Lebensdauer von Sessions verkürzen?