Objekte und Referenzen
Rato Micefarmer
- php
Hi!
Bin jetzt ein bisschen verwirrt mit Objekten & Referenzen.
Nehmen wir mal folgendes:
class A {
function ne_funktion() {
$this->b = new B($this);
}
.......REST DER KLASSE
}
class B {
function B(&$A) {
$this->a =& $A;
}
.......REST DER KLASSE
}
$a = new A();
$a->ne_funktion();
Der Sinn des Ganzen ist, dass man von $a->b aus auf Funktionen von $a zugreifen kann, und dabei auch etwaige in der Funktion verwendete Variablen von $a miteinbezogen werden. Deshalb braucht $a->b eine Referenz auf $a, damit die Variablen auch immer korrekt sind.
Nun heißt es im PHP-Manual, dass bei '$var = new myObject();' $var eine Kopie des Objektes enthält.
Deshalb mein Frage: Wird in '$a->ne_funktion()' bei '$this->b = new B($this);' auch indirekt eine Kopie von '$b->a' angefertigt, oder ist diese weiterhin eine Referenz auf $a?
mfg
Rato
P.S: Hoffe, ich habe mich halbwegs verständlich und nicht zu blödsinnig ausgedrückt ;)
Hi Rato,
Mag sein, dass das nicht das ist, was du hören willst, aber dein Programmcode sieht sehr stark nach PHP 4 aus. Steige endlich auf PHP 5 um, es ist höchste Zeit dazu.
„[13-Jul-2007] The PHP development team hereby announces that support
for PHP 4 will continue until the end of this year only.”
(Zitat php.net)
In PHP 5 werden Objekte grundsätzlich als call-by-reference übergeben. Wenn du ein Objekt kopieren willst, musst du dies explizit mit __clone() machen.
Insofern kannst du unter PHP 5 getrost folgenden Code verwenden:
class MyClassA {
private $bObject = null;
public __construct() {
// füge weiteren Code als Konstruktor ein
// falls du dies wünschst ;)
}
private _createBObject() {
$this->bObject = new MyClassB($this);
// du kannst hier weitere Modifikationen an
// dem bObject vornehmen
$this->bObject->doSomething();
}
public getBObject() {
// Wenn bObject noch nicht existiert, erstelle es
if($this->bObject == null) $this->_createBObject();
// gebe bObject zurück
return $this->bObject;
}
}
class MyClassB {
private $aObject = null;
// der erste Parameter muss ein MyClassA-Objekt sein!
public __construct(MyClassA $a) {
$this->aObject = $a;
}
public doSomething() {
// mache irgendetwas hier ;)
}
}
Fehler vorbehalten, habe das jetzt nur mal so spontan runtergeschrieben ;-)
Du könntest den Code dann z.B. so benutzen:
$a = new MyClassA();
$b = $a->getBObject();
Und schon hast du in $a und $b deine entsprechenden Objekte :-)
Viele Grüße,
~ Dennis.
Mag sein, dass das nicht das ist, was du hören willst, aber dein Programmcode sieht sehr stark nach PHP 4 aus. Steige endlich auf PHP 5 um, es ist höchste Zeit dazu.
Da hast du schon recht. Ich weiß auch um die Vorteile von PHP 5 bezüglich Objekten, jedoch hatte ich vor, das Programm, um das es geht, irgendwan in ferner Zukunft der Öffentlichkeit zur Verfügung zu stellen - und demetsprechend wollte ich es abwärtskompatibel machen. Nach deiner eindrucksvollen Demonstration überleg ichs mir jedoch noch mal ;)
mfg
Rato
Hello,
Da hast du schon recht. Ich weiß auch um die Vorteile von PHP 5 bezüglich Objekten, jedoch hatte ich vor, das Programm, um das es geht, irgendwan in ferner Zukunft der Öffentlichkeit zur Verfügung zu stellen - und demetsprechend wollte ich es abwärtskompatibel machen. Nach deiner eindrucksvollen Demonstration überleg ichs mir jedoch noch mal ;)
Zu PHP4-Zeiten hat sich OOP mMn überhaupt nicht gelohnt. Einziger Vorteil war das zusätzliche Scope; besonders wichtig, wenn man wiederverwendbaren Code schreiben oder nutzen wollte, der für oder von Andere(n) war.
Für OOP unter PHP 5.x gibt es ein neues Tut (Buch), dass ganz gut aussieht.
http://www.professionelle-softwareentwicklung-mit-php5.de/erste_auflage/
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hi Rato,
[…] das Programm […] irgendwann in ferner Zukunft der Öffentlichkeit zur Verfügung zu stellen - und dementsprechend wollte ich es abwärtskompatibel machen.
In ferner Zukunft gibt es PHP 6… und PHP 4 kennt dann keiner mehr, wenn du dann also abwärtskompatibel sein willst, dann nur zu PHP 5 ;-)
Viele Grüße,
~ Dennis.