Referenzen in PHP
Christopher Reimann
- php
0 Christopher0 MeXXi0 dedlfix
0 dedlfix
Also, in letzter Zeit ist es mir in den Sinn geraten, mit dem blinden Gebrauch der Werteparameter Schluss zu machen, da es ja logischerweise performance-sparender sein muss, im Speicher ausschließlich zu referenzieren, anstatt ihn weitläufig zu belegen.
Nun ist der Parser von PHP wohl sehr tolerant und ich weiß gar nicht genau, wie ich syntaktisch vorzugehen habe...
Einmal sei als Beispiel eine Klasse A mit der Eigenschaft B gegeben. Der Konstruktor hat einen Variblenparameter C. Ich will verursachen, dass die Eigenschaft B auf die Speicheraddresse referenziert, auf die auch der Parameter c referenziert. Mit welchem Operator geschieht dies?
class A
{
private B;
function __construct (&$C)
{
$this->B = &$C; // welcher dieser beiden Aufrufe ist denn korrekt!?
$this->C = $C; // Parsen lassen sich beide!
}
}
$this->C = $C; // Parsen lassen sich beide!
Also, man sehe von diesem TIPPFEHLER ab. (natürlich sollte $this->B
hier notiert sein)
Also, in letzter Zeit ist es mir in den Sinn geraten, mit dem blinden Gebrauch der Werteparameter Schluss zu machen, da es ja logischerweise performance-sparender sein muss, im Speicher ausschließlich zu referenzieren, anstatt ihn weitläufig zu belegen.
Nun ist der Parser von PHP wohl sehr tolerant und ich weiß gar nicht genau, wie ich syntaktisch vorzugehen habe...
Einmal sei als Beispiel eine Klasse A mit der Eigenschaft B gegeben. Der Konstruktor hat einen Variblenparameter C. Ich will verursachen, dass die Eigenschaft B auf die Speicheraddresse referenziert, auf die auch der Parameter c referenziert. Mit welchem Operator geschieht dies?
class A
{
private B;function __construct (&$C)
{
$this->B = &$C; // welcher dieser beiden Aufrufe ist denn korrekt!?
$this->C = $C; // Parsen lassen sich beide!
}
}
Stimmt: parsen lassen sich beide.
Aber: eine davon ist deprecated, also missbilligt.
Man sollte also nur so vorgehen:
function EineFunktion(&$einParameter) {
}
$derParameter = 123;
$eineVariable = EineFunktion($derParameter);
also das "&" im Funktionsheader notieren,
dann wird die Variable immer byreference übergeben.
Das "&" beim Aufruf der Funktion vor dem Parameter zu notieren ist "alte" Schreibweise... und wird soviel ich weiß von PHP (zumindest V5 im Strict Mode) als Warning (oder als Notice?) bemängelt...
echo $begrüßung;
$this->B = &$C; // welcher dieser beiden Aufrufe ist denn korrekt!?
$this->C = $C; // Parsen lassen sich beide!
Stimmt: parsen lassen sich beide.
Aber: eine davon ist deprecated, also missbilligt.
Kann ich dazu bitte eine Quelle haben? Nach meinem Wissensstand ist dem nicht so. (Ich vermute, du verwechselst das mit etwas anderem.)
Man sollte also nur so vorgehen:
function EineFunktion(&$einParameter) {...}$derParameter = 123;
$eineVariable = EineFunktion($derParameter);also das "&" im Funktionsheader notieren,
dann wird die Variable immer byreference übergeben.
Das ist nur die eine Seite. Will man die übergebene Referenz in einer Objektvariable ablegen, muss man dabei auch noch referenzieren.
Das "&" beim Aufruf der Funktion vor dem Parameter zu notieren ist "alte" Schreibweise... und wird soviel ich weiß von PHP (zumindest V5 im Strict Mode) als Warning (oder als Notice?) bemängelt...
Dafür ist die Konfigurationseinstellung allow_call_time_pass_reference zuständig.
echo "$verabschiedung $name";
echo $begrüßung;
Also, in letzter Zeit ist es mir in den Sinn geraten, mit dem blinden Gebrauch der Werteparameter Schluss zu machen, da es ja logischerweise performance-sparender sein muss, im Speicher ausschließlich zu referenzieren, anstatt ihn weitläufig zu belegen.
Du hast dir das Handbuch-Kapitel zu Referenzen durchgelesen? Wenn ja, solltest du wissen, dass man unter PHP Referenzen nur dann verwenden soll, wenn sie _nötig_ sind. Ansonsten ist PHP intern so clever, die Variablenwerte erst dann zu duplizieren, wenn sich der Inhalt ändert. Unter See also in der Beschreibung zu debug_zval_dmp() findest du auch eine genaue Erklärung, wie PHP intern mit den Variablen hantiert.
Außerdem werden Objekte unter PHP5 bereits ohne weiteres Zutun per Referenz übergeben. Hier muss man explizit clonen, wenn man eine Kopie benötigt.
Einmal sei als Beispiel eine Klasse A mit der Eigenschaft B gegeben. Der Konstruktor hat einen Variblenparameter C. Ich will verursachen, dass die Eigenschaft B auf die Speicheraddresse referenziert, auf die auch der Parameter c referenziert. Mit welchem Operator geschieht dies?
Sollte es sich bei C um einen skalaren Wert oder ein Array handeln, dann musst du ihn sowohl per Referenz übernehmen als auch per Referenz zuweisen (=&). Ansonsten übernimmst du nur eine Kopie oder/und legst nur eine Kopie in B ab.
echo "$verabschiedung $name";