Zmienne PHP są przekazywane przez wartość lub przez odwołanie?

głosy
174

PHP zmienne są przekazywane przez wartość lub przez odwołanie?

Utwórz 03/08/2008 o 23:51
źródło użytkownik
W innych językach...                            


13 odpowiedzi

głosy
-6

Zależy od wersji 4 jest wartością, 5 jest przez odniesienie.

Odpowiedział 03/08/2008 o 23:52
źródło użytkownik

głosy
19

Zmienne PHP są przydzielane przez wartości przekazywane do funkcji przez wartość, a zawierający / reprezentujących obiekty są przekazywane przez odniesienie. Można wymusić zmienne przechodzić przez odniesienie stosując &

Nadany przez przykład wartość / odniesienia:

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

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

byłoby wyjście

zm1: testy, var2: test końcowy, VAR3: test końcowy

Przeszedł przez exampe / wartość odniesienia:

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

changeThem($var1, $var2);

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

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

byłoby wyjście:

zm1: foo, var2 BAR

Zmiennych obiektu przekazywane przez exampe odniesienia:

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

Czy wyjście:

BLA

(Ten ostatni przykład może być lepiej chyba ...)

Odpowiedział 03/08/2008 o 23:52
źródło użytkownik

głosy
215

Jest wartością według dokumentacji PHP .

Domyślnie, argumenty funkcji są przekazywane przez wartość (tak, że jeżeli wartość argumentu wewnątrz funkcji ulegnie zmianie, to nie zmieni poza funkcją). Aby umożliwić funkcji modyfikowanie jej argumentów, muszą być przekazywane przez referencję.

Aby mieć argument do funkcji zawsze przekazywane przez referencję, poprzedź znak ampersand ( & ) przed nazwą zmiennej w definicji funkcji.

<?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.'
?>
Odpowiedział 04/08/2008 o 00:06
źródło użytkownik

głosy
24

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

W PHP 5 jest nowy Object Model. obsługa PHP z obiektów został całkowicie przepisany, co pozwala na lepszą wydajność i więcej funkcji. W poprzednich wersjach PHP, obiekty były traktowane jak prymitywnych typów (na przykład liczb całkowitych i ciągi). Wadą tego sposobu, że semantycznie cały obiekt została skopiowana kiedy zmienna został przydzielony lub przekazywane jako parametr do metody. W nowym podejściu, obiekty są odniesione przez uchwyt, a nie przez wartość (można myśleć uchwytem jako identyfikator obiektu jest).

Odpowiedział 04/08/2008 o 00:57
źródło użytkownik

głosy
4

Zmienne zawierające prymitywne typy są przekazywane przez wartość w PHP5. Zmienne zawierające przedmioty przechodzą przez odniesienie. Jest to dość ciekawy artykuł z Linux Journal z 2006 roku, który wspomina o tym i innych różnic OO między 4 i 5.

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

Odpowiedział 04/08/2008 o 01:05
źródło użytkownik

głosy
52

Wydaje się, że wiele osób się mylić przy okazji obiekty są przekazywane do funkcji i co przechodzą przez środek odniesienia. Zmienne obiektowe są nadal przekazywane przez wartość, to tylko wartość, która jest przekazywana w PHP5 jest uchwyt odniesienia. Jako dowód:

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

wyjścia:

a, b

Aby przejść przez odniesienie oznacza, że możemy modyfikować zmienne, które są postrzegane przez rozmówcę. Który wyraźnie powyższy kod nie robi. Musimy zmienić funkcję swap do:

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

wyjścia:

b, a

aby przejść przez odniesienie.

Odpowiedział 11/08/2008 o 03:09
źródło użytkownik

głosy
5

Można zrobić to w obu kierunkach.

umieścić symbol „&” z przodu i zmienna trzeba przejechać się jednym i tym samym jako jego pochodzenia. czyli: można przekazać przez odniesienie, zamiast dokonywania kopię.

więc

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
Odpowiedział 22/02/2009 o 10:17
źródło użytkownik

głosy
1

Obiekty są przekazywane przez referencję w PHP 5 oraz wartości w PHP 4. Zmienne są przekazywane przez wartość domyślnie!

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

Odpowiedział 09/01/2010 o 17:34
źródło użytkownik

głosy
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>";

Atrybuty są ciągle modyfikowane, gdy nie przeszedł przez odniesienie więc uważaj.

Wydajność:

SwapObjects: B, A SwapValues: a, b

Odpowiedział 11/05/2010 o 16:51
źródło użytkownik

głosy
37

W PHP domyślnie obiektów są przekazywane jako kopia odniesienia do nowego obiektu.

Zobacz ten przykład .............

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

Teraz zobaczyć ..............

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.

Teraz zobaczyć ..............

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.

Mam nadzieję, że można to zrozumieć.

Odpowiedział 14/03/2012 o 07:09
źródło użytkownik

głosy
7

Możesz przekazać zmienną do funkcji poprzez odniesienie. Funkcja ta będzie mógł zmodyfikować zmienną oryginalną.

Można zdefiniować przejście przez odniesienie w definicji funkcji:

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
Odpowiedział 21/12/2014 o 09:27
źródło użytkownik

głosy
0

Właściwie oba sposoby są ważne, ale to zależy od twoich wartości requirement.Pass przez odniesienie często sprawia, że ​​skrypt powolny. Tak że lepiej przekazać zmienne o wartości rozważając czas realizacji. Również przepływ kod jest bardziej spójna, gdy przekazywanie zmiennych przez wartość.

Odpowiedział 15/07/2015 o 11:25
źródło użytkownik

głosy
0

Służy do funkcji gdy chcesz po prostu zmienić zmienną oryginalną i odesłać go ponownie do tej samej nazwy zmiennej z jej nowej wartości przypisanej.

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
Odpowiedział 31/03/2018 o 12:34
źródło użytkownik

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