Les variables PHP sont-elles passées par valeur ou par référence?
Réponses
Trop de publicités?C'est, en valeur, selon la Documentation de PHP.
Par défaut, la fonction, les arguments sont passés par valeur (de sorte que si la valeur de l'argument dans la fonction est changé, il n'est pas changé à l'extérieur de la fonction). Pour permettre une fonction pour modifier ses arguments, ils doivent être passés par référence.
Pour avoir un argument à une fonction toujours passés par référence, ajouter une esperluette (&) de l'argument dans la définition de la fonction.
<?php
En PHP, les objets By default sont transmis en tant que 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 ceci ..............
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 ceci ..............
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 cela.
Il semble que beaucoup de gens se confondre par la façon dont les objets sont passés aux fonctions et ce passage par référence signifie. Les variables d'objet sont toujours passés par valeur, c'est juste la valeur qui est passé en PHP5 est une référence de la poignée. 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";
Sorties:
a b
De passage par référence , nous pouvons modifier les variables qui sont vus par l'appelant. Ce qui est clairement le code ci-dessus ne fait pas. Nous avons besoin de changer la fonction de permutation:
<?php
function swap(&$x, &$y) {
$tmp = $x;
$x = $y;
$y = $tmp;
}
dans l'ordre de passage par référence.
http://www.php.net/manual/en/migration5.oop.php
En PHP 5, il y a un nouveau Modèle d'Objet. PHP est de la manipulation d'objets a été complètement réécrit, permettant de meilleures performances et plus de fonctionnalités. Dans les versions précédentes de PHP, les objets ont été traitées comme des types primitifs (par exemple des entiers et des chaînes de caractères). L'inconvénient de cette méthode est que de la sémantique de l'objet entier a été copié lorsqu'une variable a été cédé ou transmis en tant que paramètre d'une méthode. Dans la nouvelle approche, les objets sont référencés par la poignée, et non par valeur (on peut penser à une poignée comme un objet d'identification).
@Karl
En PHP5, les variables sont passées par défaut par valeur et les objets sont par défaut passés par référence.
L'un ou l'autre peut être facultativement transmis par référence en utilisant l'opérateur & .
Cependant, la plupart des anciennes fonctions PHP ne modifieront pas une primitive même si vous passez une référence ...
$str = "hello world";
echo $str; // hello world
echo strrev($str); // dlrow olleh
strrev( &$str ); // ! Warning is issued
echo $str; // hello world
$str = strrev($str);
echo $str; // dlrow olleh
Si vous essayez de transmettre une valeur en tant que référence, un avertissement sera émis. C'est à la fonction de décider de travailler sur la valeur ou la référence.