variabili - punto esclamativo php




Le variabili PHP vengono passate per valore o per riferimento? (9)

Le variabili PHP vengono passate per valore o per riferimento?


È in base al valore secondo la documentazione di PHP .

Per impostazione predefinita, gli argomenti della funzione vengono passati per valore (in modo che se il valore dell'argomento all'interno della funzione viene modificato, non viene modificato al di fuori della funzione). Per consentire a una funzione di modificare i suoi argomenti, devono essere passati per riferimento.

Per avere un argomento a una funzione sempre passato per riferimento, anteporre una e commerciale ( & ) al nome dell'argomento nella definizione della funzione.

<?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.'
?>

È possibile passare una variabile a una funzione per riferimento. Questa funzione sarà in grado di modificare la variabile originale.

È possibile definire il passaggio per riferimento nella definizione della funzione:

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>


In PHP, per impostazione predefinita gli oggetti vengono passati come copia di riferimento a un nuovo oggetto.

Vedi questo esempio .............

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

Ora guarda questo ..............

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.

Ora guarda questo ..............

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.

spero che tu possa capire questo.


Le variabili PHP vengono assegnate per valore, passate alle funzioni per valore e quando contengono / rappresentano oggetti vengono passate per riferimento. Puoi forzare il passaggio delle variabili per riferimento usando un &

Assegnato da esempio valore / riferimento:

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

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

sarebbe uscita

var1: test, var2: test finale, var3: test finale

Passato dall'esempio valore / riferimento:

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

changeThem($var1, $var2);

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

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

produrrebbe:

var1: foo, var2 BAR

Variabili oggetto passate dall'esempio di riferimento:

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

Uscita:

FOO

(l'ultimo esempio potrebbe essere migliore probabilmente ...)


Le variabili contenenti tipi primitivi vengono passate per valore in PHP5. Le variabili contenenti oggetti vengono passate per riferimento. C'è un articolo abbastanza interessante dal Linux Journal del 2006 che menziona questa e altre differenze OO tra 4 e 5.

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


Sembra che molte persone siano confuse dal modo in cui gli oggetti vengono passati alle funzioni e dal significato di passaggio per riferimento. Le variabili oggetto vengono comunque passate per valore, è solo il valore che viene passato in PHP5 è un handle di riferimento. Come prova:

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

Uscite:

a, b

Passare per riferimento significa che possiamo modificare le variabili che vengono visualizzate dal chiamante. Che chiaramente il codice sopra non lo fa. Dobbiamo modificare la funzione di scambio in:

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

Uscite:

b, a

per passare per riferimento.


Utilizzare questo per le funzioni quando si desidera semplicemente modificare la variabile originale e restituirla allo stesso nome di variabile con il nuovo valore assegnato.

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

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

Gli attributi sono ancora modificabili quando non vengono passati per riferimento, quindi fai attenzione.

Produzione:

SwapObjects: b, a SwapValues: a, b





pass-by-value