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;
}
}
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
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
> 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
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