Er PHP variabler forbi verdi eller referanse?

stemmer
184

Er PHP variabler forbi verdi eller referanse?

Publisert på 03/08/2008 klokken 22:51
kilden bruker
På andre språk...                            


13 svar

stemmer
231

Det er av verdi i henhold til PHP dokumentasjon .

Som standard er funksjonsargumenter vedtatt av verdi (slik at hvis verdien av argumentet i funksjonen endres, det blir ikke endret utenfor funksjonen). Å tillate en funksjon for å endre sine argumenter, må de sendes ved referanse.

For å ha et argument til en funksjon alltid gått med referanse, foran et tegn ( & ) til argumentet navn i funksjonsdefinisjon.

<?php
function add_some_extra(&$string)
{
    $string .= 'and something extra.';
}

$str = 'This is a string, ';
add_some_extra($str);
echo $str;    // outputs 'This is a string, and something extra.'
?>
Svarte 03/08/2008 kl. 23:06
kilden bruker

stemmer
55

Det synes mange mennesker bli forvirret av måten gjenstander sendes til funksjoner og hva pasning fra referanse midler. Objektvariabler er fortsatt vedtatt av verdi, det bare verdien som er gått i PHP5 er en referanse håndtak. Som bevis:

<?php
class Holder {
    private $value;

    public function __construct($value) {
        $this->value = $value;
    }

    public function getValue() {
        return $this->value;
    }
}

function swap($x, $y) {
    $tmp = $x;
    $x = $y;
    $y = $tmp;
}

$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);

echo $a->getValue() . ", " . $b->getValue() . "\n";

utganger:

a, b

Å passere ved henvisning betyr at vi kan endre de variablene som blir sett av den som ringer. Som klart koden ovenfor ikke gjør. Vi trenger å endre swap-funksjonen til:

<?php
function swap(&$x, &$y) {
    $tmp = $x;
    $x = $y;
    $y = $tmp;
}

$a = new Holder('a');
$b = new Holder('b');
swap($a, $b);

echo $a->getValue() . ", " . $b->getValue() . "\n";

utganger:

b, a

for å passere ved referanse.

Svarte 11/08/2008 kl. 02:09
kilden bruker

stemmer
42

I PHP, som standard gjenstander sendes som referanse kopi til et nytt objekt.

Se dette eksempelet .............

class X {
  var $abc = 10; 
}

class Y {

  var $abc = 20; 
  function changeValue($obj)
  {
   $obj->abc = 30;
  }
}

$x = new X();
$y = new Y();

echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 30

Nå ser dette ..............

class X {
  var $abc = 10; 
}

class Y {

  var $abc = 20; 
  function changeValue($obj)
  {
    $obj = new Y();
  }
}

$x = new X();
$y = new Y();

echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 10 not 20 same as java does.

Nå ser dette ..............

class X {
  var $abc = 10; 
}

class Y {

  var $abc = 20; 
  function changeValue(&$obj)
  {
    $obj = new Y();
  }
}

$x = new X();
$y = new Y();

echo $x->abc; //outputs 10
$y->changeValue($x);
echo $x->abc; //outputs 20 not possible in java.

Jeg håper du kan forstå dette.

Svarte 14/03/2012 kl. 06:09
kilden bruker

stemmer
24

http://www.php.net/manual/en/migration5.oop.php

I PHP 5 er det en ny Object Model. PHP håndtering av gjenstander har blitt fullstendig omskrevet, noe som åpner for bedre ytelse og flere funksjoner. I tidligere versjoner av PHP, ble gjenstander håndteres som primitive typer (for eksempel tall og strenger). Ulempen med denne metoden er at semantisk hele objektet ble kopiert når en variabel er tilordnet, eller sendes som en parameter til en metode. I den nye tilnærmingen, er stedene referert til av håndtaket, og ikke av verdi (man kan tenke på et håndtak som et objekt identifikator).

Svarte 03/08/2008 kl. 23:57
kilden bruker

stemmer
19

PHP variabler tildeles av verdi, føres til funksjoner ved verdi, og når de inneholder / som representerer objekter sendes ved referanse. Du kan tvinge variabler å passere ved henvisning bruke en &

Tilordnet av verdi / referanse eksempel:

$var1 = "test";
$var2 = $var1;
$var2 = "new test";
$var3 = &$var2;
$var3 = "final test";

print ("var1: $var1, var2: $var2, var3: $var3);

ville utgang

Var1: test, var2: endelige testen, var3: siste test

Vedtatt av verdien / referanse exampe:

$var1 = "foo";
$var2 = "bar";

changeThem($var1, $var2);

print "var1: $var1, var2: $var2";

function changeThem($var1, &$var2){
    $var1 = "FOO";
    $var2 = "BAR";
}

ville utgang:

Var1: foo, var2 BAR

Objekt variabler vedtatt av referansen exampe:

class Foo{
    public $var1;

    function __construct(){
        $this->var1 = "foo";
    }

    public function printFoo(){
        print $this->var1;
    }
}


$foo = new Foo();

changeFoo($foo);

$foo->printFoo();

function changeFoo($foo){
    $foo->var1 = "FOO";
}

Ville utgang:

FOO

(Det siste eksempelet kan være bedre sannsynligvis ...)

Svarte 03/08/2008 kl. 22:52
kilden bruker

stemmer
7

Du kan sende en variabel til en funksjon ved referanse. Denne funksjonen vil være i stand til å endre den opprinnelige variable.

Du kan definere passasjen ved referanse i funksjonsdefinisjonen:

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
Svarte 21/12/2014 kl. 09:27
kilden bruker

stemmer
5

Du kan gjøre det uansett.

sette en '&' symbol foran og variable du passerer blir ett og det samme som sin opprinnelse. dvs: du kan passere som referanse, snarere enn å lage en kopi av den.

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
Svarte 22/02/2009 kl. 09:17
kilden bruker

stemmer
4

Variabler som inneholder primitive typer blir passert av verdi i PHP5. Variabler som inneholder objekter sendes ved referanse. Det er en ganske interessant artikkel fra Linux Journal fra 2006 som nevner dette og andre OO forskjeller mellom fire og fem.

http://www.linuxjournal.com/article/9170

Svarte 04/08/2008 kl. 00:05
kilden bruker

stemmer
1
class Holder
{
    private $value;

    public function __construct( $value )
    {
        $this->value = $value;
    }

    public function getValue()
    {
        return $this->value;
    }

    public function setValue( $value )
    {
        return $this->value = $value;
    }
}

class Swap
{       
    public function SwapObjects( Holder $x, Holder $y )
    {
        $tmp = $x;

        $x = $y;

        $y = $tmp;
    }

    public function SwapValues( Holder $x, Holder $y )
    {
        $tmp = $x->getValue();

        $x->setValue($y->getValue());

        $y->setValue($tmp);
    }
}


$a1 = new Holder('a');

$b1 = new Holder('b');



$a2 = new Holder('a');

$b2 = new Holder('b');


Swap::SwapValues($a1, $b1);

Swap::SwapObjects($a2, $b2);



echo 'SwapValues: ' . $a2->getValue() . ", " . $b2->getValue() . "<br>";

echo 'SwapObjects: ' . $a1->getValue() . ", " . $b1->getValue() . "<br>";

Attributtene er fortsatt modifiserbare når ikke bestått ved henvisning så pass.

Produksjon:

SwapObjects: B, A SwapValues: a, b

Svarte 11/05/2010 kl. 15:51
kilden bruker

stemmer
1

Objekter er vedtatt av referanse i PHP 5 og av verdi i PHP 4. Variabler vedtatt av verdi som standard!

Les her: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html

Svarte 09/01/2010 kl. 16:34
kilden bruker

stemmer
0

Bruk dette for funksjoner når du ønsker å bare endre den opprinnelige variable og returnere den igjen til samme variabel navn med sin nye verdien tildelt.

function add(&$var){ // The &amp; is before the argument $var
   $var++;
}
$a = 1;
$b = 10;
add($a);
echo "a is $a,";
add($b);
echo " a is $a, and b is $b"; // Note: $a and $b are NOT referenced
Svarte 31/03/2018 kl. 12:34
kilden bruker

stemmer
0

Egentlig begge metodene er gyldig, men det avhenger av dine requirement.Pass verdier ved henvisning ofte gjør skriptet treg. Så det er bedre å passere variabler av verdi ved å vurdere tidspunkt for gjennomføring. Også koden flyten er mer konsekvent når du passerer variabler av verdi.

Svarte 15/07/2015 kl. 11:25
kilden bruker

stemmer
-6

Avhengig av hvilken versjon, 4 er av verdi, 5 er ved referanse.

Svarte 03/08/2008 kl. 22:52
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more