Lösung:
http://www.php.net/manual/de/language.oop5.references.php
Siehe Beispiel #1 Referenzen und Objekte
Also, falls es mal jemand braucht:
Allgemein, also ohne Klassen kann man ja mit & Referenzen zwischen (zB) Variablen aufbauen.
$a = 1;
$b =& $a; # beide vars zeigen nun auf den gleichen inhalt (also 1) (php.net: "sind Referenzen")
echo $a; # == 1
echo $b; # == 1
Klassen:
class A{
public $var = 1;
}
$a = new A;
$b = $a; # $a und $b sind Kopien des gleichen Bezeichners //quote php.net (EDIT: also keine referenzen)
$a->foo = 2;
echo $a->foo."\n"; # == 2
echo $b->foo."\n"; # == 2
Alles anzeigen
Und genau deswegen,
weil durch das bereits bestehende Object $a eine Kopie $b erzeugt wird, welche auf den gleichen Inhalt zeigt,
deswegen also bekomme ich im Bsp vom ersten Post eine Referenz.
Einfaches Bsp:
class User
{
public $name = 'hans';
}
class UserController
{
public $user;
public function init($user) # btw: init(User $user) würde eine instanz von User erwarten, ... aber andermal ...
{
$this->user = $user;
# gleiche wie oben:
# $b = $a; # $a und $b sind Kopien des gleichen Bezeichners //quote php.net (EDIT: also keine referenzen)
# nur das wir hier den zeiger auf die eigenschaft "user" der klasse setzen
}
}
$user = new User();
echo $user->name; # == hans
$a = new UserController();
$a->init($user);
echo $a->user->name; # == hans
$user->name = 'paul';
echo $user->name; # == paul
echo $a->user->name; # == paul
# achtung: wir "löschen" das "original" object $user:
$user = null;
# aber die kopie ist immernoch vorhanden
echo $a->user->name; # == paul
Alles anzeigen
und jetzt wirds interessant:
Im oberen "einfachen Bsp" haben wir kopiert. Dabei haben beide auf den gleichen Bezeichner des Inhalts gezeigt, aber "das eine kann auch ohne dem anderen".
Löscht man also eine Kopie, existiert immer noch die Andere.
EDIT: wie auf php.net erwähnt:
Zitat
$a und $b sind Kopien des gleichen Bezeichners
ich versuch das mal darzustellen:
inhalt
|
bezeichner
| |
kopie $a kopie $b
Will man also beide referenzieren
müssen wir & benutzen:
class User
{
public $name = 'hans';
}
class UserController
{
public $user;
public function init(&$user) # mit & das "eingehende" object referenzieren ...
{
$this->user = &$user; # ... UND(!) bei der zuweisung per & referenzieren
# warum 2 mal & ?
# weil wir das object 2 mal "weitergeben" =)
# bei jeder weitergabe muss also "geklärt" werden, WIE es übergeben werden soll
}
}
$user = new User();
$a = new UserController();
$a->init($user);
$user = null; # das "original" löschen (beide verweisen auf den gleichen bezeichner, der wiederum nun auf null verweist)
echo $a->user->name; # == Notice: Trying to get property of non-object in C:\xampp\htdocs\...
Alles anzeigen
Damit ist also sichergestellt, dass die Instatz von User in meinem Controller genau den gleichen Zustand hat wie die "originale" Instatz außerhalb =)
sorry - viel, aber wertvoll =)
EDIT: bsp entfernt, weil verwirrend