ich hab mich schon immer gefragt wie das eigentlich in php ist, hier die antwort:
PHP
<?php
class Simple {
private $foo;
public function Simple($string) {
$this->foo = $string;
}
public function setFoo($foo) {
$this->foo = $foo;
}
public function __toString() { // override magic method
return $this->foo;
}
public function addBar() {
$this->foo .= ' bar';
return $this; // return yourself
}
}
$s0 = new Simple('s0');
$s0->addBar()->addBar()->addBar()->addBar();
echo "s0 = $s0 <br /><br />";
$s1 = new Simple('s1'); // same as: $s1 =& new Simple('s1');
$s2 = new Simple('s2');
$s3 = $s1; // same as: $s3 =& $s1;
$s3->setFoo('s3 was reassigned from s1');
$s4 = clone $s2;
$s4->setFoo('s4 was cloned from s2');
printf("s1 = %s<br />", $s1);
printf("s2 = %s<br />", $s2);
printf("s3 = %s<br />", $s3);
printf("s4 = %s<br />", $s4);
echo '<br />';
echo '<br />';
class Ext {
public function Ext() {
}
public function doSimple($simple) { // same as: (&$simple) {
$simple->setFoo('ext did something');
}
}
$s5 = new Simple('s5');
$s6 = new Simple('s6 passed as clone');
$ext = new Ext();
$ext->doSimple($s5);
$ext->doSimple(clone $s6);
printf("s5 = %s<br />", $s5);
printf("s6 = %s<br />", $s6);
/*
generates:
--------------
s0 = s0 bar bar bar bar
s1 = s3 was reassigned from s1
s2 = s2
s3 = s3 was reassigned from s1
s4 = s4 was cloned from s2
s5 = ext did something
s6 = s6 passed as clone
*/
?>
Alles anzeigen
kurz gesagt: es wird -wie bei java auch- immer nur die referenz uebergeben, niemals das objekt (adressen auslesen mit dem &-operator haben keinen (zusaetzlichen) effekt). um eine kopie zu uebergeben muss das objekt vorher mit dem schluesselwort "clone" kopiert werden.
zumindest ist das so in der version 5.2.0