Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

OOP: Doppelte Referenzen?

0 views
Skip to first unread message

Marco Wittwer

unread,
Feb 19, 2004, 3:59:00 AM2/19/04
to
Hallo

Ich habe eine Frage zu untenstehendem Code in der Klasse bbb, Methode aaa:
So wie er hier steht, funktioniert er, das heisst das Objekt ccc wird
ausgegeben. Wenn ich in dieser Methode aber schreibe
$x = &ccc::load();
, also ohne den Umweg über $y, wird nichts ausgegeben.

Kann mir das jemand erklären, resp. Lösungsvorschläge geben?
Vielen Dank
Gruss Marco

new bbb();

class ccc {
var $c=0;
function ccc() {
$this->c = 9;
}

function load() {
return new ccc();
}
}


class bbb {
var $b = 0;
function bbb() {
$a = null;
$this->aaa($a);
print_r($a);
}

function aaa(&$x) {
$y = &ccc::load();
$x = $y;
}
}


Dirk Oschlies

unread,
Feb 19, 2004, 4:17:22 AM2/19/04
to
Hallo,

Marco Wittwer schrieb:


> Ich habe eine Frage zu untenstehendem Code in der Klasse bbb, Methode aaa:
> So wie er hier steht, funktioniert er, das heisst das Objekt ccc wird
> ausgegeben. Wenn ich in dieser Methode aber schreibe
> $x = &ccc::load();
> , also ohne den Umweg über $y, wird nichts ausgegeben.
>

Wenn du von einer Funktion eine Referenz zurückgeben willst, dann musst
du das auch in der Funktion so definieren:

function &load() {
}

und, wie du es auch schon gemacht hast, als refernz annehmen

$x =& load();

(Alles mal ohne die Klassen dargestellt)


Wobei ich in deinem Beispiel die Methode ccc::load() irgendwie nicht
verstehe. Die macht zumindest so wie sie da steht gar keinen Sinn.
In der Methode bbb::aaa() würde der Aufruf $x =& new ccc() reichen.
Wobei du überhaupt bei diesem Konstrukt mal das PHP Manual Kapitel über
Referenzen (15(de)/14(en)/10(chm)) durchlesen solltest. Das was du da
machen willst geht so nämlich auch gar nicht mit Referenzen.

Bedenke Referenzen sind keine Pointer.


Grüße
Dirk Oschlies

Dirk Oschlies

unread,
Feb 19, 2004, 4:20:38 AM2/19/04
to
Hallo nochmal,

hier noch meine Lösungsvorschlag:

$b =& new bbb();

class ccc {
var $c=0;
function ccc() {
$this->c = 9;
}
}

class bbb {


var $b = 0;
function bbb() {

$a =& new ccc();
print_r($a);
}
}

Grüße
Dirk Oschlies

Marco Wittwer

unread,
Feb 24, 2004, 5:23:45 AM2/24/04
to
> function &load() {
> }
das funktioniert aber auch ohne dieses &?!

>
> Wobei ich in deinem Beispiel die Methode ccc::load() irgendwie nicht
> verstehe. Die macht zumindest so wie sie da steht gar keinen Sinn.
> In der Methode bbb::aaa() würde der Aufruf $x =& new ccc() reichen.
das beispiel ist natürlich nur ein kleiner teil aus meinem projekt.

> Wobei du überhaupt bei diesem Konstrukt mal das PHP Manual Kapitel über
> Referenzen (15(de)/14(en)/10(chm)) durchlesen solltest. Das was du da
> machen willst geht so nämlich auch gar nicht mit Referenzen.

wieso nicht? ich habe die lösung gefunden:
in der methode aaa
$x = ccc::load();
anstelle von
$x = &ccc::load();


>
> Bedenke Referenzen sind keine Pointer.

wirklich? ist das nicht zu vergleichen mit den pointern von c? bei c ist es
mir jeweils klar, wo ich den * und wo das & setzen muss. aber hier bei php
habe ich oft mühe mit dem &.

gruss marco


Dirk Oschlies

unread,
Feb 25, 2004, 2:18:50 AM2/25/04
to
Hallo,

Marco Wittwer schrieb:


>>function &load() {
>>}
> das funktioniert aber auch ohne dieses &?!

Ja funktionieren tut es vielleicht, nur wird dann nicht die Referenz auf
die Variable, sondern eine Kopie der Variable zurückgegeben.

> das beispiel ist natürlich nur ein kleiner teil aus meinem projekt.

Na gut, dasw hab ich mir schon gedacht ;)

>>Wobei du überhaupt bei diesem Konstrukt mal das PHP Manual Kapitel über
>>Referenzen (15(de)/14(en)/10(chm)) durchlesen solltest. Das was du da
>>machen willst geht so nämlich auch gar nicht mit Referenzen.
>

> wieso nicht? ...

Wie gesagt, schau einfach mal ins Manual an besagter Stelle steht ein
sehr ähnliches Beispiel zum Thema "Sowas geht nicht".


>>Bedenke Referenzen sind keine Pointer.
>
> wirklich? ist das nicht zu vergleichen mit den pointern von c? bei c ist es
> mir jeweils klar, wo ich den * und wo das & setzen muss. aber hier bei php
> habe ich oft mühe mit dem &.

Nochmal: schau ins Manual, da steht auch was der Unterschied ist
zwischen Refernzen und Pointern.


Grüße
Dirk Oschlies

0 new messages