Domanda

Sono le variabili PHP passati per valore o per riferimento?

È stato utile?

Soluzione

Da noi il valore, secondo la Documentazione di PHP.

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

Per avere un argomento di una funzione sempre passati per riferimento, premettere una e commerciale (&) per il 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.'
?>

Altri suggerimenti

Sembra che un sacco di gente ottenere confuso dal modo in cui gli oggetti vengono passati alle funzioni e cosa passa per riferimento significa.Le variabili oggetto sono ancora passati per valore, è solo il valore che viene passato in PHP5 è un riferimento maniglia.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

Per passaggio per riferimento siamo in grado di modificare le variabili che sono visti dal chiamante.Chiaramente il codice di cui sopra non.Abbiamo bisogno di cambiare la funzione di scambio per:

<?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 da riferimento.

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

Vedere 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.

Vedere 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.

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

In PHP 5 c'è un nuovo Modello di Oggetto.PHP manipolazione di oggetti, è stato completamente riscritto, consentendo una migliore performance e funzionalità.Nelle versioni precedenti di PHP, gli oggetti sono stati trattati come tipi primitivi (ad esempio numeri interi e stringhe).Lo svantaggio di questo metodo è che dal punto di vista semantico, l'oggetto è stato copiato quando una variabile è stato assegnato, o passato come parametro ad un metodo.Nel nuovo approccio, sono gli oggetti a cui fa riferimento la maniglia, e non per valore (si può pensare ad un manico come un oggetto identifier).

PHP le variabili sono assegnate in base al valore, passati alle funzioni per valore, e quando che contiene/che rappresentano gli oggetti sono passati per riferimento.È possibile forzare variabili da passare da riferimento per l'utilizzo di un &

Assegnato dal valore di riferimento esempio:

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

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

sarebbe uscita

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

Passato dal valore di riferimento exampe:

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

changeThem($var1, $var2);

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

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

sarebbe uscita:

var1:pippo, var2 BAR

Oggetto variabili passate per riferimento 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";
}

Sarebbe uscita:

PIPPO

(ultimo esempio potrebbe essere migliore, probabilmente...)

È possibile passare una variabile ad una funzione di 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
?>

Si può fare in entrambi i modi.

mettere un '&' simbolo in fronte e la variabile che si sta passando diventa una sola cosa con la sua origine.vale a dire:è possibile passare da un riferimento, piuttosto che fare una copia di esso.

così

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.

Le variabili che contengono i tipi primitivi sono passati per valore in PHP5.Le variabili contenenti gli oggetti sono passati per riferimento.C'è un interessante articolo di Linux Journal dal 2006 che parla di questo e di altre OO differenze tra il 4 e il 5.

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

Gli oggetti sono passati per riferimento in PHP 5 e dal valore in PHP 4.Le variabili vengono passate da un valore di default!

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

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 è passato per riferimento, quindi fate attenzione.

Output:

SwapObjects:b, un SwapValues:a, b

In realtà entrambi i metodi sono validi, ma dipende dalla vostra esigenza.Passare i valori di riferimento rende spesso il tuo script lento.Quindi è meglio passare variabili in base al valore, considerando il tempo di esecuzione.Anche il flusso di codice è più consistente quando si passa variabili per valore.

Utilizzare questo per funzioni quando si desidera semplicemente di modificare la variabile originale e ritorno di nuovo per lo stesso nome della variabile con il suo 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

Dipende dalla versione, 4 è il valore 5 è da riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top