mmofacts.com

Variablen innerhalb einer Klasse reseten

gepostet vor 17 Jahre, 9 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, 9 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, 9 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, 9 Monate von Nuky
Exakt
Gerne!

Auf diese Diskussion antworten