Unterschied zwischen = und =&
Guten Tag,
es klemmt zu diesem Thema gerade in meinem Kopf, aber kann mir
jemand den Unterschied zwischen den beiden Zeilen
$a = new A;
$a =& new A;
erklaeren?
Im PHP-Manual Kapitel 18 "Klassen und Objekte", welches ich gerade
durcharbeite, finde ich die Formulierung:
/* Singleton. Every instatiation returns the "same" object.
*
* for this to work, ALWAYS create objects with $object =& new
* class(). The reference operator doesn't do any harm in general
* and is necessary for singletons.
Mir erschlieszt sich das nicht, was da gesagt wird und wo ich es in
der Praxis anwende.
Danke!
Grusz,
Peter Blancke
--
Hoc est enim verbum meum!
Re: Unterschied zwischen = und =&
Peter Blancke schrieb:
> Guten Tag,
>
> es klemmt zu diesem Thema gerade in meinem Kopf, aber kann mir
> jemand den Unterschied zwischen den beiden Zeilen
>
> $a = new A;
> $a =& new A;
>
> erklaeren?
>
> Im PHP-Manual Kapitel 18 "Klassen und Objekte", welches ich gerade
> durcharbeite, finde ich die Formulierung:
Nicht ganz richtiges Kapitel. Siehe dieses hier:
http://www.php.net/manual/en/language.references.php
Gruß,
Torsten
Re: Unterschied zwischen = und =&
Peter Blancke wrote:
> Unterschied zwischen den beiden Zeilen
>
> $a = new A;
> $a =& new A;
In <http://www.php.net/manual/en/language.references.whatdo.php> steht:
| Since PHP 5, new return reference automatically so using =& in this
| context is deprecated and produces E_STRICT level message.
Verstehe ich das richtig, dass es in PHP5 zwischen den obigen beiden
Zeiilen überhaupt keinen Unterschied mehr gibt?
Gruß,
Michael
--
Testscript für RegEchsen:
http://diesundas.funzt-halt.net/regextest.php
Re: Unterschied zwischen = und =&
Ad 2007-07-26, Torsten Zühlsdorff <thorny [at] meisterderspiele.de> dixit:
> Peter Blancke schrieb:
>> es klemmt zu diesem Thema gerade in meinem Kopf, aber kann mir
>> jemand den Unterschied zwischen den beiden Zeilen
>>
>> $a = new A;
>> $a =& new A;
>>
>> erklaeren?
>>
>> Im PHP-Manual Kapitel 18 "Klassen und Objekte", welches ich
>> gerade durcharbeite, finde ich die Formulierung:
>
> Nicht ganz richtiges Kapitel. Siehe dieses hier:
> http://www.php.net/manual/en/language.references.php
Oh, danke, das ging schnell. Kapitel 21, ja, da war ich noch nicht.
Referenzuebergabe bei Funktionsaufrufen kannte ich ja schon und habe
das auch bereits eingesetzt. Mir ist vielleicht nicht ganz klar,
warum man beim Einrichten einer Klassenvariable (das nennt sich dann
wohl Instantiieren) auch das & verwendet. Ich sehe den Vorteil noch
nicht. Spart das Speicherplatz? Arbeitet das Skript schneller?
Grusz,
Peter Blancke
--
Hoc est enim verbum meum!
Re: Unterschied zwischen = und =&
Michael Ziegler schrieb:
> Peter Blancke wrote:
>> Unterschied zwischen den beiden Zeilen
>>
>> $a = new A;
>> $a =& new A;
>
> In <http://www.php.net/manual/en/language.references.whatdo.php> steht:
> | Since PHP 5, new return reference automatically so using =& in this
> | context is deprecated and produces E_STRICT level message.
>
> Verstehe ich das richtig, dass es in PHP5 zwischen den obigen beiden
> Zeiilen überhaupt keinen Unterschied mehr gibt?
Wenn man den E_STRICT Fehler mal außen vorläßt: Ja.
Beides erzeugt eine Referenz auf die Instanz der Klasse A.
Gruß,
Torsten
Re: Unterschied zwischen = und =&
Peter Blancke schrieb:
> Ad 2007-07-26, Torsten Zühlsdorff <thorny [at] meisterderspiele.de> dixit:
>> Peter Blancke schrieb:
>
>>> es klemmt zu diesem Thema gerade in meinem Kopf, aber kann mir
>>> jemand den Unterschied zwischen den beiden Zeilen
>>>
>>> $a = new A;
>>> $a =& new A;
>>>
>>> erklaeren?
>>>
>>> Im PHP-Manual Kapitel 18 "Klassen und Objekte", welches ich
>>> gerade durcharbeite, finde ich die Formulierung:
>> Nicht ganz richtiges Kapitel. Siehe dieses hier:
>> http://www.php.net/manual/en/language.references.php
>
> Oh, danke, das ging schnell. Kapitel 21, ja, da war ich noch nicht.
>
> Referenzuebergabe bei Funktionsaufrufen kannte ich ja schon und habe
> das auch bereits eingesetzt. Mir ist vielleicht nicht ganz klar,
> warum man beim Einrichten einer Klassenvariable (das nennt sich dann
> wohl Instantiieren) auch das & verwendet. Ich sehe den Vorteil noch
> nicht. Spart das Speicherplatz? Arbeitet das Skript schneller?
Eine Klassenvariable ist für gewöhnlich eine Variable in einer Klasse.
Es gibt auch noch Instanzvariablen.
Aber in diesem Fall ist gar nichts von beiden der Fall. Es wird eine
Referenz auf die Instanz der Klasse A erstellt.
Referenzen bedeuten konkret, dass die Instanz nicht kopiert wird, sobald
man sie übergibt. Nicht kopieren spart Platz und ist schneller ;)
Gruß,
Torsten
Re: Unterschied zwischen = und =&
Ad 2007-07-26, Torsten Zühlsdorff <thorny [at] meisterderspiele.de> dixit:
> Referenzen bedeuten konkret, dass die Instanz nicht kopiert wird, sobald
> man sie übergibt. Nicht kopieren spart Platz und ist schneller ;)
Das heiszt aber hoffentlich auch, dasz die Variablen -- egal wie ich
sie einrichte -- sich auf keinen Fall gegenseitig ins Gehege kommen
koennen.
Ich habe mir mal die Ausgabe folgenden Skripts angeschaut, die das
bestaetigt:
<?php
error_reporting(E_ALL);
class A
{
public $string;
public function __construct()
{
print "Gestartet...\n";
}
}
$a =& new A;
$b =& new A;
$a->string="Test";
var_dump ($a);
var_dump ($b);
?>
Allerdings ergeben Zeitmessungen (auf einem Linux-System) mit dem
Aufruf
time for i in `seq 1 100`; do php index.php > /dev/null ; done
nur geringe Laufzeitunterschiede; nehme ich das & hinzu, dauert es
geringfuegig laenger. Das Skript ist fuer Laufzeitmessungen
allerdings auch nicht optimal, weil ich den PHP-Aufruf auf der
Konsole mit drinhabe. Ich mueszte mal eine Schleife um die
Variablenzuweisung setzen.
Grusz,
Peter Blancke
--
Hoc est enim verbum meum!
Re: Unterschied zwischen = und =&
Hallo Peter,
* Peter Blancke <blancke [at] gmx.de>:
> Referenzuebergabe bei Funktionsaufrufen kannte ich ja schon und habe
> das auch bereits eingesetzt. Mir ist vielleicht nicht ganz klar,
> warum man beim Einrichten einer Klassenvariable (das nennt sich dann
> wohl Instantiieren) auch das & verwendet. Ich sehe den Vorteil noch
> nicht. Spart das Speicherplatz? Arbeitet das Skript schneller?
Den Kommentar-Schnipsel hast du aus meinem Kommentar auf dieser Seite
geholt, dort steht auch, wofür das (wohlgemerkt bei PHP4) von mir
gedacht war.
In PHP4 wird ein Objekt durch den Zuweisungs-Operator *kopiert*, damit
ist es einfach unmöglich, ein Singleton zu implementieren, dessen /eine/
Instanz man mittels new erhält. IMHO war das eine blöde Idee der
PHP-Entwickler, denn meistens ist eine Kopie sowieso unnötig (gerade bei
der ersten Zuweisung von new). Wenn man konsequent alle Objekt-
Zuweisungen mit Referenz-Operator macht (außer natürlich falls man
explizit kopieren /will/), klappt dann auch eine Singleton-
Implementierung, bei der der Konstruktor das Einzelstück liefert.
Für PHP5 solltest du das einfach wieder vergessen, da wird soweit ich
weiß per default mit Referenzen gearbeitet.
Grüße, Felix
--
Felix M. Palmen (Zirias) \ -PGP- <fmp [at] palmen.homeip.net> /"\ ASCII Ribbon
web: http://zirias.ath.cx/ \ http://zirias.ath.cx/pub.txt \ / Campaign
my open source projects: \ FP ED9B 62D0 BE39 32F9 2488 X Against HTML In
http://zirias.ath.cx/?pg=pro \ 5D0C 8177 9D80 5ECF F683 / \ Mail And News
Re: Unterschied zwischen = und =&
Ad 2007-07-26, Felix M. Palmen <zirias [at] despammed.com> dixit:
> Für PHP5 solltest du das einfach wieder vergessen, da wird soweit
> ich weiß per default mit Referenzen gearbeitet.
Ich wurde auch erst aufmerksam auf diese Sache, nachdem ich mich mit
dem Templatesystem Sigma beschaeftigt habe und beim Studium bereits
ueber
$tpl =& new HTML_Template_Sigma('.');
stolperte.
Dann habe ich es jetzt wohl richtig verstanden, dasz ich -- hier
werkelt nur noch PHP5 -- das tatsaechlich vergessen kann und die
Zeile aus PEAR eigentlich nur noch eine Optimierung fuer den Fall
darstellt, dasz Sigma unter PHP4 zum Einsatz kommt.
Grusz,
Peter Blancke
--
Hoc est enim verbum meum!