Bonjour,

J'ai l'impression qu'en PHP les objets stockés dans un array sont passé par référence et non par valeur.

Comment faire pour ne pas stocker une reference vers l'objet ?

6 réponses


Ramzz1994
Réponse acceptée

Malheureusement, PHP ne permet pas de créer des types valeurs, un peu comme les struct, en C# et C++. Néanmoins, tu peux peut-être te renseigner sur le Shallow copy et le Deep Copy afin de copier les références, si jamais tu veux t'assurer deux objets différents. Pour les types valeurs, en C#, je crois que c'est réservé à certain types comme les entiers (voir liste http://php.net/manual/fr/language.types.php). Néamoins, si tu y tiens, je crois qu'il est possible d'ajouter un éperluette (&) devant la variable pour indiquer que tu veux passer cette variable en référence. Par exemple, si tu passes un entier en paramètre de fonction et que tu modifies sa valeur dans la fonction et bien elle sera aussi changé en dehors, soit dans la porté où la fonction a été appelée.

<?php
function maFonction (&$unEntier)
{
    $unEntier = 20;
}

$monEntier = 30;
maFonction($monEntier);
echo $monEntier; // Sera 20.

Je ne suis pas convaincu d'avoir répondu exactement à ta question, mais tu as largement ce qui faut pour te documenter sur la nature des types en PHP.

Ramz

Qu'entends-tu par là ? Si c'est ce que je pense, c'est normal, c'est le principe des objet, en JS c'est pareil.

arnich
Auteur

Merci.

J'ai contourné le problème en créant un instance différent de l'objet a chaque tour de ma boucle (7 objets Date c'est pas grand chose)

Si tu veux, expliques nous la situation (et/ou avec du code), on pourra peut-être t'aider à améliorer ça. :-)

oui explique car je comprends pas du tout ta question et vu la réponse j'ai l'impression d'avoir encore moins compris.

mais si la question cétait que

$obj = new Obj();
$array = array();
$array[0] = $obj;
$obj->changeUneValeur = "valeur"
// si le problème c'est que changer l'objet ici, change l'objet dans l'array, oui c'est normal
// si tu veux le stocker que sur l'array, du coup oui
$array[0] = new Obj(); // tu instancie directement dans l'array, donc il ne sera modifiable que ici

Salut,

Il faut noter que sans ce concept, bien des choses seraient différentes. Par exemple, les containeurs se basent en partie la dessus.

class Foo
{
    public $bar = false;
}

$container = new Container;

$container->set('foo', function () {
    return new Foo;
});

$foo = $container->get('foo');
$foo->bar = true;

$container->get('foo'); // même instance qu'avant, donc la propriété bar = true