mmofacts.com

Variablen innerhalb einer Klasse reseten

gepostet vor 17 Jahre, 11 Monate von n26
Hallo,
halte mich gerade seit ner ganzen Weile an nem Problem auf und habe es nun erstmal aufgeben.
Da Code mehr als 1000 Worte sagt hier:
class Irgendwas {

private $Arr = array();

public function IrgendEineFunktion() {

$Element = (object) array( 'Zahl' => 25 );
for( $i = 0; $i < 4; $i++ )
$this->Arr[] = $Element;
$n = 1;
while( $this->Arr ) {
unset( $Var ); // *1
$Var = array_shift( $this->Arr );
echo $Var->Zahl.'
'; // *2
$Var->Zahl -= $n;
$NeuesArr[] = $Var;
$n++;
}

print_r( $NeuesArr ); // *3
}
}
$bla = new Irgendwas();
$bla->IrgendEineFunktion();
?>
*3 - Theoretisch müsste print_r folgendes ausgeben:
Array ( [0] => stdClass Object ( [Zahl] => 24 ) [1] => stdClass Object ( [Zahl] => 22 ) [2] => stdClass Object ( [Zahl] => 19 ) [3] => stdClass Object ( [Zahl] => 15 ) )

Tut es aber nicht, der Inhalt sieht wie folgt aus:
Array ( [0] => stdClass Object ( [Zahl] => 15 ) [1] => stdClass Object ( [Zahl] => 15 ) [2] => stdClass Object ( [Zahl] => 15 ) [3] => stdClass Object ( [Zahl] => 15 ) )

Deswegen habe ich mir mal den Wert nach dem übergeben des ersten Array-Elementes angeschaut -> *2. Die Ausgabe sieht wie folgt aus:
25

24
22
19
D.h. $Var wird nicht resetet bzw nicht überschrieben.
Aus diesem Grund habe ich Versucht $Var komplett erstmal zu reseten (*1),
Habe es veruscht mit:
unset( $Var );
,
$Var = array();

und
$Var = null;

Hatte mit keiner der Möglichkeiten Erfolg....
Nunja nun meine Frage, wie schaffe ich es, dass die Variable neu beschrieben wird?
Danke im voraus.
LG
gepostet vor 17 Jahre, 11 Monate von Nuky
Du siehst das ganze irgendwie vom falschen Ansatz, fürchte ich.
Du musst dich entscheiden ob du die Objekte jetzt als Referenz übergeben bekommen willst oder nicht - einmal rechnest du damit, einmal nicht.
Manchmal sagen Kommentare mehr als 1000 Worte

class Irgendwas {
private $Arr = array();

public function IrgendEineFunktion() {

$Element = (object) array( 'Zahl' => 25 );
for( $i = 0; $i < 4; $i++ )
$this->Arr[] = $Element; // jede Reihe im Array ist eine Referenz zu $Element
$n = 1;
while( $this->Arr ) {
unset( $Var ); //du resettest zwar die Variable...
$Var = array_shift( $this->Arr ); //aber holst dir hier den Wert von der Referenz..
echo $Var->Zahl.'
';
$Var->Zahl -= $n; //den du hier Reinschreibst
$NeuesArr[] = $Var; //Hallo Array, hier hast du eine Referenz zu $Element!
$n++;
}

print_r( $NeuesArr ); //4x Print von $Element
}
}
$bla = new Irgendwas();
$bla->IrgendEineFunktion();
?>

Um das Verhalten zu Verhindern kannst du entweder $bla= clone($objekt); benutzen oder zu PHP 4 wechseln
MfG,
Nukey
gepostet vor 17 Jahre, 11 Monate von n26
clone()

ist das Stichwort!
Daraus Folgt:
 

for( $i = 0; $i < 4; $i++ )
$this->Arr[] = clone( $Element );
Ich danke dir vielmals, so komme ich weiter!
gepostet vor 17 Jahre, 11 Monate von Nuky
Exakt
Gerne!

Auf diese Diskussion antworten