Vad referenser gör

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Vad referenser gör

Det finns tre grundläggande operationer som utförs med hjälp av referenser: tilldelning med referens, passering med referens och retur med referens. Denna sektion ger en introduktion till dessa operationer, med länkar för vidare läsning.

Tilldela med referens

I det första fallet tillåter PHP-referenser dig att få två variabler att referera till samma innehåll. Det innebär att när du gör:

<?php
$a =& $b;
?>

så betyder det att `$a` och `$b` pekar på samma innehåll.

Notera:

`$a` och `$b` är helt lika här. `$a` pekar inte på `$b` eller vice versa. `$a` och `$b` pekar på samma plats.

Notera:

Om du tilldelar, passerar eller returnerar en odefinierad variabel med referens, kommer den att skapas.

Exempel #1 Använda referenser med odefinierade variabler
<?php
function foo(&$var) { }

foo($a); // $a "skapas" och tilldelas null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new stdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>

Samma syntax kan användas med funktioner som returnerar referenser:

<?php
$foo =& find_var($bar);
?>

Att använda samma syntax med en funktion som inte returnerar med referens kommer att ge ett fel, likaså om det används med resultatet från operatorn `new`. Även om objekt skickas runt som pekare, är dessa inte samma sak som referenser, vilket förklaras under Objekt och referenser.

Varning:

Om du tilldelar en referens till en variabel som deklareras global inuti en funktion, kommer referensen endast att vara synlig inuti funktionen. Du kan undvika detta genom att använda arrayen `$GLOBALS`.

Exempel #2 Referera till globala variabler inuti funktioner
<?php
$var1 = "Exempelvariabel";
$var2 = "";

function global_references($use_globals)
{
    global $var1, $var2;
    if (!$use_globals) {
        $var2 =& $var1; // synlig endast inuti funktionen
    } else {
        $GLOBALS["var2"] =& $var1; // synlig även i globalt sammanhang
    }
}

global_references(false);
echo "var2 är satt till '$var2'\n"; // var2 är satt till ''
global_references(true);
echo "var2 är satt till '$var2'\n"; // var2 är satt till 'Exempelvariabel'
?>

Tänk på `global $var;` som en genväg till `$var =& $GLOBALS['var'];`. Således ändras endast den lokala variabelns referens om du tilldelar en annan referens till `$var`.

Notera:

Om du tilldelar ett värde till en variabel med referenser i en `foreach`-sats, ändras referenserna också.

Exempel #3 Referenser och foreach-sats
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
    // gör något
}
echo $ref; // 3 - sista elementet i den itererade arrayen
?>

Även om det inte strikt är en tilldelning med referens, kan uttryck skapade med språkbyggnaden `array()` också bete sig så genom att lägga till `&` framför arrayelementet som ska läggas till. Exempel:

<?php
$a = 1;
$b = array(2, 3);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++; $arr[1]++; $arr[2]++;
/* $a == 2, $b == array(3, 4); */
?>

Notera dock att referenser inuti arrayer kan vara potentiellt farliga. Att göra en vanlig (inte med referens) tilldelning med en referens på höger sida gör inte vänstra sidan till en referens, men referenser inuti arrayer bevaras i dessa vanliga tilldelningar. Detta gäller även funktionsanrop där arrayen skickas med värde. Exempel:

<?php
/* Tilldelning av skalära variabler */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c är inte en referens; ingen förändring på $a eller $b

/* Tilldelning av arrayvariabler */
$arr = array(1);
$a =& $arr[0]; //$a och $arr[0] är i samma referensset
$arr2 = $arr; //inte en tilldelning med referens!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* Innehållet i $arr ändras även om det inte är en referens! */
?>

Med andra ord definieras referensbeteendet hos arrayer på en element-för-element-basis; referensbeteendet för individuella element är skilt från referensstatusen för arraybehållaren.

Passera med referens

Det andra som referenser gör är att passera variabler med referens. Detta görs genom att skapa en lokal variabel i en funktion och en variabel i den anropande omfattningen som refererar till samma innehåll. Exempel:

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
?>

kommer att göra att `$a` blir 6. Detta sker eftersom variabeln `$var` i funktionen `foo` refererar till samma innehåll som `$a`. För mer information om detta, läs avsnittet om att passera med referens.

Returnera med referens

Det tredje som referenser kan göra är att returnera med referens.


Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.references.whatdo.php
PHP
Språkreferens
Språkreferens#Referenser Förklarade


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp som har sponsrat Linux.se med webserver.