2009-03-25 6 views
1

Ich versuche, eine Referenz in einer Funktion festzulegen. Aber ich kann das nicht funktionieren.Wie stelle ich eine Referenz innerhalb der PHP-Funktion ein?

Code I versucht:

function set(&$x, &$y) 
{ 
    $x =& $y[2]; 
} 

$y = array(
    0, 
    1, 
    array('something') 
); 

$x = array('old_val'); 
print "1. inited, x is:\n"; 
print_r($x); 

set($x, $y); 

print "\n2. now, x is: "; 
print_r($x); 

Ausgang:

1. inited, x is: 
Array 
(
    [0] => old_val 
) 

2. now, x is: Array 
(
    [0] => old_val 
) 

ich den Wert von $ x erwarte als $ y gleich sein [2]. Außerdem sollte jede weitere Änderung an $ x $ y ändern [2]. (Wie in Zeigerzuweisung in C: x = &y[2];) Was mache ich falsch? Irgendwelche Vorschläge geschätzt.

Edit: eigentlich ist die Funktion set() im Test-Code eine vereinfachte für meine Testzwecke. Es ist tatsächlich select_node (& $ x, & $ tree, $ selector): Dies wird einen Knoten aus dem Baum auswählen, der $ selector entspricht und ihn $ x zuweist.

+0

Ok , sehr merkwürdig. Es funktioniert, wenn Sie $ x innerhalb der Funktion etwas zuweisen (es setzt es zurück in das Array und es wird außerhalb der Funktion gesetzt), aber es funktioniert nicht umgekehrt ... hmmm. –

Antwort

3

Referenzen sind keine Zeiger und verhalten sich etwas anders.

Was passiert ist, dass die Variable $ x innerhalb der Funktion set() an die gleiche Stelle wie $ y [2] gebunden ist, aber $ x innerhalb set() ist nicht das gleiche wie $ x außerhalb der Menge (). Beide zeigen auf den gleichen Ort, aber Sie haben nur den einen innerhalb von set() aktualisiert, der nicht länger relevant ist, sobald set() zurückkehrt. Es gibt keine Möglichkeit zu bind das $ x im aufrufenden Bereich, wie es nicht innerhalb der Funktion existiert.

See: http://ca3.php.net/manual/en/language.references.arent.php

Sie möchten festlegen erklären() einen Verweis auf Rückkehr:

function &set(&$x, &$y) {} 

Und es so nennen:

$x =& set($x,$y); 

Siehe http://ca3.php.net/manual/en/language.references.return.php

1

Hier ist nichts falsch. Die x in Funktion Set() ist ein lokalen Alias ​​für die globale Variable x. Mit anderen Worten zeigen die globalen x und x in Funktion set() auf den gleichen Wert. Nachdem Sie dies tun:

$x =& $y[2]; 

Lokale x zeigt nun auf den Wert von $ y [2] aber die globale x immer noch auf den alten Wert. Sie müssen diese Seite lesen http://php.net/references