Sont variables PHP passés par valeur ou par référence?

voix
174

Sont variables PHP passés par valeur ou par référence?

Créé 03/08/2008 à 23:51
source utilisateur
Dans d'autres langues...                            


13 réponses

voix
215

Il est par la valeur en fonction de la documentation PHP .

Par défaut, les arguments de la fonction sont passés par valeur (de sorte que si la valeur de l'argument dans la fonction est modifiée, il ne soit pas changé en dehors de la fonction). Pour permettre une fonction de modifier ses arguments, ils doivent être passés par référence.

Avoir un argument à une fonction toujours passé par référence, préfixer une esperluette ( & ) au nom de l' argument dans la définition de la fonction.

<?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.'
?>
Créé 04/08/2008 à 00:06
source utilisateur

voix
52

Il semble que beaucoup de gens se confondre par la façon dont les objets sont passés aux fonctions et ce qui passe par des moyens de référence. variables d'objets sont toujours passés par valeur, est juste la valeur qui est passée dans une poignée est PHP5 de référence. Comme preuve:

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

Les sorties:

a, b

Pour passer par référence signifie que nous pouvons modifier les variables qui sont vues par l'appelant. Qui a clairement le code ne fait pas ci - dessus. Nous devons changer la fonction d'échange à:

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

Les sorties:

b, a

afin de passer par référence.

Créé 11/08/2008 à 03:09
source utilisateur

voix
37

En PHP, par des objets par défaut sont transmis comme copie de référence à un nouvel objet.

Voir cet exemple .............

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

Maintenant, voyez ce ..............

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.

Maintenant, voyez ce ..............

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.

J'espère que vous pouvez comprendre.

Créé 14/03/2012 à 07:09
source utilisateur

voix
24

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

PHP 5 est un nouveau modèle d'objet. La manipulation des objets PHP a été complètement réécrite, ce qui permet de meilleures performances et plus de fonctionnalités. Dans les versions précédentes de PHP, les objets ont été traités comme des types primitifs (pour les entiers et les chaînes d'exemple). L'inconvénient de cette méthode est que l'objet entier sémantiquement a été copié lorsqu'une variable a été affecté, ou transmis en tant que paramètre à une méthode. Dans la nouvelle approche, les objets sont référencés par la poignée, et non par la valeur (on peut penser à une poignée comme identifiant d'un objet).

Créé 04/08/2008 à 00:57
source utilisateur

voix
19

variables PHP sont affectés par la valeur, transmises à des fonctions de valeur, et quand contenant / objets représentant sont transmis par référence. Vous pouvez forcer les variables à passer par référence en utilisant un &

Affecté par exemple valeur / référence:

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

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

sortie serait

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

Passé par valeur / référence exampe:

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

changeThem($var1, $var2);

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

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

sortie serait:

var1: foo, BAR var2

Objet variables passées par référence 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";
}

Est-ce que la sortie:

FOO

(Ce dernier exemple pourrait être probablement mieux ...)

Créé 03/08/2008 à 23:52
source utilisateur

voix
7

Vous pouvez passer une variable à une fonction par référence. Cette fonction sera en mesure de modifier la variable d'origine.

Vous pouvez définir le passage par référence dans la définition de la fonction:

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

$result=5;
changeValue($result);

echo $result; // $result is 6 here
?>
Créé 21/12/2014 à 09:27
source utilisateur

voix
5

Vous pouvez le faire de toute façon.

mettre un symbole « & » à l'avant et la variable que vous passez devient une seule et même que son origine. à savoir: vous pouvez passer par référence, plutôt que de faire une copie de celui-ci.

alors

    $fred = 5;
    $larry = & $fred;
    $larry = 8;
    echo $fred;//this will output 8, as larry and fred are now the same reference.
Créé 22/02/2009 à 10:17
source utilisateur

voix
4

Les variables contenant des types primitifs sont passés par valeur en PHP5. Variables contenant des objets sont passés par référence. Il est tout à fait un article intéressant de Linux Journal de 2006 qui mentionne cela et d'autres différences OO entre 4 et 5.

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

Créé 04/08/2008 à 01:05
source utilisateur

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

Les attributs sont toujours modifiables lorsqu'ils ne sont pas passé par référence alors méfiez-vous.

Sortie:

SwapObjects: b, un SwapValues: a, b

Créé 11/05/2010 à 16:51
source utilisateur

voix
1

Les objets sont passés par référence en PHP 5 et par la valeur en PHP 4. Les variables sont passés par valeur par défaut!

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

Créé 09/01/2010 à 17:34
source utilisateur

voix
0

Utilisez cette fonction pour lorsque vous souhaitez modifier simplement la variable d'origine et de le retourner à nouveau au même nom de variable avec sa nouvelle valeur attribuée.

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
Créé 31/03/2018 à 12:34
source utilisateur

voix
0

En fait, les deux méthodes sont valables, mais cela dépend de vos valeurs requirement.Pass par référence fait souvent votre lent script. Donc, de son mieux pour passer des variables en valeur en tenant compte du temps d'exécution. De plus, le flux de code est plus cohérent lorsque vous passez des variables par valeur.

Créé 15/07/2015 à 11:25
source utilisateur

voix
-6

Dépend de la version, la figure 4 est la valeur, la figure 5 est par référence.

Créé 03/08/2008 à 23:52
source utilisateur

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