Looking for php Keywords? Try Ask4Keywords

PHP Gå förbi referens


Exempel

Detta låter dig passera en variabel med hänvisning till en funktion eller element som gör att du kan ändra den ursprungliga variabeln.

Vidarebefordran är inte begränsad till endast variabler, följande kan också skickas genom referens:

  • Nya uttalanden, t.ex. foo(new SomeClass)
  • Referenser returneras från funktioner

arrayer

En vanlig användning av "förbipasserande-referens" är att ändra initialvärden inom en matris utan att gå till omfattningen av att skapa nya matriser eller kasta ditt namnområde. Att lämna-genom-referens är lika enkelt som att föregå / prefixera variabeln med en & => &$myElement .

Nedan visas ett exempel på att utnyttja ett element från en matris och helt enkelt lägga till 1 till dess initialvärde.

$arr = array(1, 2, 3, 4, 5);

foreach($arr as &$num) {
    $num++;
}

När du utnyttjar ett element inom $arr kommer det ursprungliga elementet att uppdateras när referensen ökades. Du kan verifiera detta genom att:

print_r($arr);

Notera

Du bör ta hänsyn till när du utnyttjar pass genom referens inom öglor. I slutet av ovanstående slinga har $num fortfarande en referens till det sista elementet i matrisen. Att tilldela den efter slingan kommer att manipulera det sista arrayelementet! Du kan säkerställa att detta inte händer genom att unset() "in the post-loop:

$myArray = array(1, 2, 3, 4, 5);

foreach($myArray as &$num) {
   $num++;
}
unset($num);

Ovanstående säkerställer att du inte stöter på några problem. Ett exempel på frågor som kan relatera till detta finns i denna fråga på StackOverflow .


funktioner

En annan vanlig användning för förbipasserande är inom funktioner. Att ändra den ursprungliga variabeln är så enkelt som:

$var = 5;
// define
function add(&$var) {
    $var++;
}
// call
add($var);

Vilket kan verifieras genom att echo 'den ursprungliga variabeln.

echo $var;

Det finns olika begränsningar kring funktioner, som anges nedan från PHP-dokumenten:

Obs: Det finns inget referensmärke på ett funktionssamtal - bara för funktionsdefinitioner. Funktionsdefinitioner enbart räcker för att korrekt skicka argumentet genom referens. Från PHP 5.3.0 får du en varning som säger att "pass-by-referens" för samtalstid avskrivs när du använder & in foo (& $ a); Och från och med PHP 5.4.0 togs bort pass-by-referens för samtalstid, så att använda det kommer att leda till ett dödligt fel.