Jsou PHP Proměnné předány hodnotou nebo odkazem?

hlasů
174

Jsou PHP proměnné předány hodnotou nebo odkazem?

Položena 03/08/2008 v 23:51
zdroj uživatelem
V jiných jazycích...                            


13 odpovědí

hlasů
215

Je to podle hodnoty v závislosti na PHP dokumentace .

Ve výchozím nastavení je funkce argumenty jsou předány hodnotou (tak, že pokud se změní hodnota argumentu v rámci funkce, to nedostane ke změně mimo funkci). Chcete-li umožnit funkci modifikovat své argumenty, které musí být předány podle odkazu.

Chcete-li mít argument do funkce předáván vždy odkazem, předřadit ampersand ( & ) název argumentu v definici funkce.

<?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.'
?>
Odpovězeno 04/08/2008 v 00:06
zdroj uživatelem

hlasů
52

Zdá se, že mnoho lidí se zmást tím, jak objekty jsou předány k funkcím a co přihrávka od referenčních prostředků. Proměnné objektů jsou stále předány hodnotou, je to jen hodnota, která se předává v PHP5 je odkaz rukojeť. Jako důkaz:

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

výstupy:

a, b

Chcete-li projít odkazem znamená, že můžeme změnit proměnné, které jsou viděny volajícím. Které jednoznačně kód výše nedělá. Musíme změnit odkládací funkce na:

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

výstupy:

b, a

aby se pak ve formě odkazu.

Odpovězeno 11/08/2008 v 03:09
zdroj uživatelem

hlasů
37

V PHP standardně objekty jsou předány jako referenční kopii nového objektu.

Viz tento příklad .............

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

Nyní vidět ..............

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.

Nyní vidět ..............

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.

Doufám, že můžete pochopit.

Odpovězeno 14/03/2012 v 07:09
zdroj uživatelem

hlasů
24

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

V PHP 5 je k dispozici nová Object Model. PHP manipulace s objekty byl zcela přepracován, umožňující lepší výkon a více funkcí. V předchozích verzích PHP, objekty byly zpracovány jako primitivní typy (například celá čísla a řetězce). Nevýhodou tohoto způsobu bylo to, že sémanticky celý objekt byl kopírován, kdy byla proměnná přiděleno, nebo předán jako parametr metody. V rámci nového přístupu jsou objekty odkazuje rukojetí, a ne podle hodnoty (jeden může myslet na rukojeti jako identifikátor objektu).

Odpovězeno 04/08/2008 v 00:57
zdroj uživatelem

hlasů
19

PHP proměnné jsou přiřazeny hodnoty, předán do funkce podle hodnoty, a pokud obsahuje / reprezentující objekty jsou předány podle odkazu. Můžete vynutit proměnné předat odkazem za použití &

Přidělené hodnoty / referenčního příkladu:

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

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

by výstup

var1: test, var2: závěrečný test, VAR3: závěrečný test

Předány hodnotou / referenční exampe:

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

changeThem($var1, $var2);

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

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

by výkon:

var1: foo, var2 BAR

Object proměnné předávají odkazem 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";
}

By výkon:

FOO

(Ten poslední příklad by mohly být lepší pravděpodobně ...)

Odpovězeno 03/08/2008 v 23:52
zdroj uživatelem

hlasů
7

Můžete předat proměnnou do funkce pomocí odkazu. Tato funkce bude moci provádět jakékoli úpravy původní proměnné.

Můžete definovat průchod s odkazem na definici funkce:

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
Odpovězeno 21/12/2014 v 09:27
zdroj uživatelem

hlasů
5

Můžete to udělat tak jako tak.

dal symbol ‚&‘ před a proměnné jsou předávání stává jedno a to samé jako jeho původ. ie: můžete předat podle odkazu, spíše než aby jeho kopii.

tak

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
Odpovězeno 22/02/2009 v 10:17
zdroj uživatelem

hlasů
4

Proměnné, které obsahují primitivní typy jsou předány hodnotou v PHP5. Proměnné, které obsahují objekty jsou předány podle odkazu. Je tu docela zajímavý článek z časopisu Linux Journal z roku 2006, který se zmíní o tomto a dalších OO rozdíly mezi 4 a 5.

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

Odpovězeno 04/08/2008 v 01:05
zdroj uživatelem

hlasů
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>";

Atributy jsou stále modifikovatelné když neprošel odkazem, takže mějte se na pozoru.

Výstup:

SwapObjects: b, jen SwapValues: a, b

Odpovězeno 11/05/2010 v 16:51
zdroj uživatelem

hlasů
1

Objekty jsou předány podle odkazu v PHP 5 a podle hodnoty v PHP 4. Proměnné jsou předány hodnotou standardně!

Čtěte zde: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html

Odpovězeno 09/01/2010 v 17:34
zdroj uživatelem

hlasů
0

Slouží pro funkce, když chcete jednoduše změnit původní proměnnou a vrátí jej znovu se stejným názvem proměnné s novou hodnotou přiřazena.

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
Odpovězeno 31/03/2018 v 12:34
zdroj uživatelem

hlasů
0

Ve skutečnosti obě metody jsou platné, ale to záleží na vašich requirement.Pass hodnot odkazem často dělá váš skript pomalý. Takže je lepší předat proměnné podle hodnoty tím, že zvažuje čas popravy. Také průtok kód je konzistentní při předání proměnné podle hodnoty.

Odpovězeno 15/07/2015 v 11:25
zdroj uživatelem

hlasů
-6

Závisí na verzi 4 je hodnotou, 5 je ve formě odkazu.

Odpovězeno 03/08/2008 v 23:52
zdroj uživatelem

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