Vă mulțumim pentru susținere

Variabilele PHP sunt transmise prin valoare sau prin referință?

Sunt variabilele PHP transmise prin valoare sau prin referință?

0
adăugat editat
adăugat autor nawfal

13 răspunsuri

PHP variables are assigned by value, passed to functions by value, and when containing/representing objects are passed by reference. You can force variables to pass by reference using an &

Atribuit prin valoare / exemplu de referință:

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

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

ar produce

var1: test, var2: test final, var3: test final

Trecute prin valoarea / raportul de referință:

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

changeThem($var1, $var2);

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

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

ar produce:

var1: foo, var2 BAR

Obiectivele variabilelor trecute prin referință:

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";
}

ar produce:

FOO

(ultimul exemplu ar putea fi mai bine ...)

0
adăugat
"Obiectele" nu sunt valori în PHP5 și nu pot fi "trecute". Valoarea $ foo este un pointer la un obiect . $ foo este trecut prin valoare la funcția changeFoo () , changeFoo cu un & .
adăugat autor newacct

Este de valoare în conformitate cu Documentația PHP .

By default, function arguments are passed by value (so that if the value of the argument within the function is changed, it does not get changed outside of the function). To allow a function to modify its arguments, they must be passed by reference.

To have an argument to a function always passed by reference, prepend an ampersand (&) to the argument name in the function definition.


0
adăugat
Am avut, de asemenea, această îndoială (newbie) - așa că doar pentru a fi clar, aceasta ar fi aceeași cu $ str = add_some_extra ($ str); dacă nu folosesc referința, nu? atunci care este valoarea adăugată reală a acesteia?
adăugat autor Obmerk Kronen
@Obmerk Dacă ați fost nu folosind ampersand pentru a semnifica prin referință, nu ar fi echivalent. Observați cum funcția nu are nicio instrucțiune de returnare, astfel că $ str ar fi atribuit null, în cazul tău.
adăugat autor Kimberly W
dacă faci acest lucru @ObmerkKronen atunci va trebui să returnați valoarea și să-l prindeți și prin codul dvs. Variabila inițială va rămâne aceeași în caz contrar.
adăugat autor Nabeel Khan
Mă întreb dacă trece prin referință ceva beneficii de performanță sau nu? Trec printr-o gamă largă și, în mod implicit, trece prin valoare. Deci, dacă folosesc apel prin referință atunci, va fi un avantaj înțelept de performanță ??? (păstrând neschimbate valorile matricei pe parcursul întregului proces)
adăugat autor Choxx
beneficiul real este că poți manipula / întoarce valori muliple. De asemenea, puteți trece variabilele prin referință și le permiteți funcției să returneze ceva.
adăugat autor MA-Maddin

Variabilele care conțin tipuri primitive sunt trecute prin valoare în PHP5. Variabilele care conțin obiecte sunt transmise prin referință. Există un articol destul de interesant din Jurnalul Linux din 2006 care menționează această diferență și alte diferențe OO între 4 și 5.

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

0
adăugat
Toate variabilele sunt transmise prin valoare în PHP dacă parametrul funcției nu are & .
adăugat autor newacct

Se pare că o mulțime de oameni se confundă prin modul în care obiectele sunt transmise funcțiilor și ceea ce trece prin mijloace de referință. Variabilele obiectului sunt încă transmise prin valoare, doar valoarea care este transmisă în PHP5 este un mâner de referință. Ca dovadă:

0
adăugat
Aceasta nu este o dovadă . Ieșirea primului exemplu este exact ceea ce v-ați aștepta dacă valoarea curentă a întregului obiect a fost transmisă funcției swap ; cu alte cuvinte, dacă obiectele au fost "promovate prin valoare". Pe de altă parte, este exact ceea ce v-ați aștepta dacă un mâner de obiect a fost transferat funcției, ceea ce este de fapt ceea ce se întâmplă. Codul dvs. nu face distincția între aceste două cazuri.
adăugat autor EML
Cred că această dovadă este o interpretare greșită. Se pare că ați încercat să schimbați referințele. Aveți o problemă cu modul în care sunt atribuite obiectele. Voi transferați referința care este imuabilă. Este valoarea pe care o indică faptul că poate fi schimbată din interior. Redefinirea swapului trece acum ** x, ceea ce vă permite să schimbați * x. Problema este să ne gândim că $ x = $ y ar schimba ceea ce indica inițial $ x.
adăugat autor grantwparks

Depinde de versiune, 4 este de valoare, 5 este de referință.

0
adăugat
Nu cred că este adevărat.
adăugat autor Nick Heiner

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

În PHP 5 există un nou model de obiect. Manipularea obiectelor de către PHP a fost complet rescrisă, permițând o performanță mai bună și mai multe caracteristici. În versiunile anterioare de PHP, obiectele au fost tratate ca tipuri primitive (de exemplu, întregi și șiruri). Neajunsul acestei metode a fost acela că întregul obiect a fost copiat în mod semantic când o variabilă a fost atribuită sau trecută ca parametru unei metode. În noua abordare, obiectele sunt menționate de mâner și nu de valoare (se poate gândi la un mâner ca la un identificator al unui obiect).

0
adăugat

În PHP, în mod implicit, obiectele sunt transferate ca o copie de referință la un obiect nou.

Vedeți acest exemplu .............

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

Acum vezi acest ..............

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.

Acum vezi acest ..............

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.

Sper că puteți înțelege acest lucru.

0
adăugat
Prima ex, valoarea referinței lui obj este trecută la funcție, modificările la obj folosind noua referință se vor reflecta la toate celelalte referințe care indică același obiect. Al doilea exemplu, valoarea VALUE a referinței lui obj este transmisă funcției, funcția schimbă valoarea referinței pentru a indica un nou obiect, vechiul obiect rămâne același. Al treilea ex, referința valorii referinței lui obj este trecută în funcție, astfel încât modificările funcției funcționează pe același volum.
adăugat autor s-hunter
Acest lucru ilustrează foarte bine modul în care funcționează obiectul PHP.
adăugat autor Frederik Krautwald

Puteți transmite o variabilă unei funcții prin referință. Această funcție va putea modifica variabila originală.

Puteți defini pasajul prin referință în definiția funcției:


0
adăugat

Utilizați această funcție pentru funcții când doriți să modificați pur și simplu variabila originală și să o returnați din nou la același nume de variabilă cu noua valoare atribuită.

function add(&$var){ // The & 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
0
adăugat

Puteți să o faceți oricum.

put a '&' symbol in front and the variable you are passing becomes one and the same as its origin. ie: you can pass by reference, rather than making a copy of it.

asa de

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
0
adăugat
Acest lucru este depreciat și generează un avertisment
adăugat autor fijiaaron

Obiectele sunt transmise prin referință în PHP 5 și prin valoare în PHP 4. Variabilele sunt transmise prin valoare în mod prestabilit!

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

0
adăugat
"Obiectele" nu sunt valori în PHP5 și nu pot fi "trecute". Toate variabilele sunt transmise prin valoare dacă parametrul funcției trecut nu are & .
adăugat autor newacct
@ FélixGagnon-Grenier: Din nou, "obiectele" nu sunt valori și nu pot fi "trecute". Nu puteți avea o "variabilă" în PHP5 a cărei valoare este un "obiect", puteți avea doar o valoare care este o referință de obiect (adică un pointer la un obiect). Desigur, puteți să transmiteți sau să atribuiți un indicator unui obiect prin valoare și să modificați obiectul pe care îl indică apelând o metodă care modifică astfel. Asta nu are nimic de-a face cu trecerea prin referință. Ce tip de valoare este și dacă un parametru este pass-by-value / pass-by-reference sunt lucruri independente și ortogonale.
adăugat autor newacct
@newacct nu destul? Obiectele sunt depășite oarecum prin referință . Cred că am observat că obiectele php pot fi modificate prin funcții chiar și atunci când nu sunt definite cu & în fața parametrilor din definiție - dacă s-au trecut prin valoare obiectul conținut în domeniul de aplicare care a sunat funcția cu acesta ca parametru nu ar fi afectată.
adăugat autor Félix Gagnon-Grenier
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() . "
"; echo 'SwapObjects: ' . $a1->getValue() . ", " . $b1->getValue() . "
";

Atributele sunt încă modificabile atunci când nu sunt transmise prin referință.

ieşire:

SwapObjects: b, a Valori Swap: a, b

0
adăugat

De fapt, ambele metode sunt valabile, dar depind de cerința dvs. Valorile pasului prin referință fac de multe ori scriptul tău mai lent. Deci este mai bine să treci variabilele prin valoare luând în considerare timpul de execuție. De asemenea, fluxul de cod este mai consistent atunci când treceți variabilele în funcție de valoare.

0
adăugat