L'opérateur =&

Eléphant du PHP | 314 Messages

27 janv. 2011, 12:08

Salut,

il y a quelques temps, je suis tombé sur l'opérateur =&, je me suis renseigné dessus et j'ai compris que c'était une assignation par référence, et que donc
$toto = 5;
$tata =& $toto;
$tata += 2;
// $toto (toujours)== $tata == 7
Si je modifie tata, la valeur de toto sera également modifiée, et vice versa...

De la même manière mais plus farfelu, il est également possible de faire ( directement depuis la DOC ) :
<?php
$a = 1;
$b = array(2, 3);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++; $arr[1]++; $arr[2]++;
/* $a == 2, $b == array(3, 4); */
?>
Je ne sais pas si j'aurai à me service de ça un jour, mais c'est possible.

Maintenant ma question, j'ai lu il y a un moment que l'opérateur new retourne une référence, est ce que ça signifie que
$oTest = new Test();
est identique à
$oText = &new Test();
??

Et si on se dit que $a toujours égal à $b, quel intérêt de créer une nouvelle variable pour cela ? je ne comprend pas toujours bien l'interêt des références, mis à par lors de l'utilisation de foreach
foreach($arr as &$valeurParRef)
{

}
ou à la limite passer une paramètre à une fonction, tout en sachant qu'on pourrait très bien faire un return avec les valeurs de retour souhaités ( économie de mémoire peut-être ? )
Cordialement,
Julien - http://laravel.fr/

ViPHP
ViPHP | 5462 Messages

27 janv. 2011, 12:16

oui les références, c'est pratique dans le sens ca économise de la mémoire, et au niveau des fonctions tu peux retourner true ou false, mais pas tout l'objet en lui même, t'as un meilleur contrôle du retour.
Après je t'avouerais que comme toi à part pour les foreach je m'en sert jamais.

Eléphant du PHP | 314 Messages

27 janv. 2011, 12:47

Et d'après toi, ( ou n'importe qui :D ), y a t'il un intérêt à utiliser les références avec les objet ? Je sais pas pourquoi mais je me dis qu'avec singleton, il doit y avoir des choses à faire, mais je vois pas quoi :/
Cordialement,
Julien - http://laravel.fr/

ViPHP
ViPHP | 5462 Messages

27 janv. 2011, 12:50

Et d'après toi, ( ou n'importe qui :D ), y a t'il un intérêt à utiliser les références avec les objet ? Je sais pas pourquoi mais je me dis qu'avec singleton, il doit y avoir des choses à faire, mais je vois pas quoi :/
les objets sont de tout façon forcement en référence, c'etait pas le cas en PHP 4 c'est pour ca qu'on voit des lib avec des =& partout et des & fonction, bref des & a toutes les sauces.

Eléphant du PHP | 314 Messages

27 janv. 2011, 13:33

Le fait que new fasse des références ça signifie quoi au juste ? Parce qu'il ne me semble pas que dans le cas suivant, $a == $b
$a = new a();
$b = new a();

$a->val=5;
echo $b->val;
Alors qu'est ce qui serait une référence au juste ? juste l'accès au code de la classe en mémoire ?
Cordialement,
Julien - http://laravel.fr/

ViPHP
ViPHP | 5462 Messages

27 janv. 2011, 16:10

Le fait que new fasse des références ça signifie quoi au juste ? Parce qu'il ne me semble pas que dans le cas suivant, $a == $b
$a = new a();
$b = new a();

$a->val=5;
echo $b->val;
Alors qu'est ce qui serait une référence au juste ? juste l'accès au code de la classe en mémoire ?

c'est dans se sens la :
$a = new stdClass();
$b = $a;

$b->val=5;
var_dump($a);
la seul façon de vraiment copier un objet c'est de faire clone
$a = new stdClass();
$b = clone $a;

$b->val=5;
var_dump($a);
var_dump($b);

Eléphant du PHP | 314 Messages

27 janv. 2011, 16:24

Ah c'est vachement intéressant, merci pour ces explications !
Cordialement,
Julien - http://laravel.fr/

devlop78
Invité n'ayant pas de compte PHPfrance

28 janv. 2011, 02:55

oui les références, c'est pratique dans le sens ca économise de la mémoire, et au niveau des fonctions tu peux retourner true ou false, mais pas tout l'objet en lui même, t'as un meilleur contrôle du retour.
Après je t'avouerais que comme toi à part pour les foreach je m'en sert jamais.
A savoir que, d'après une doc que j'avais lue, si

$b = 3;
$a = $b;

alors $a fait dans un premier temps référence à $b jusqu'à ce que $a soit modifié. Cela est un mécanisme interne à Php, et donc il n'y aurait pas de duplication de données, donc pas de perte de mémoire (si ce n'est celle qui précise que $a est référence temporaire de $b, ce qui occupe la même place que pour une référence explicite).

Pour ma part, je n'utilise même pas les références dans un foreach (j'utilise la $key), mais il m'arrive de le faire pour certaines fonctions. De façon globale, je ne les utilise quasiment pas (car ce n'est pas le rôle, en général, d'une méthode ou d'une fonction de modifier une valeur, mais bien d'en retourner une, sauf pour les procédures).

ViPHP
ViPHP | 5462 Messages

28 janv. 2011, 11:13

oui les références, c'est pratique dans le sens ca économise de la mémoire, et au niveau des fonctions tu peux retourner true ou false, mais pas tout l'objet en lui même, t'as un meilleur contrôle du retour.
Après je t'avouerais que comme toi à part pour les foreach je m'en sert jamais.
A savoir que, d'après une doc que j'avais lue, si

$b = 3;
$a = $b;

alors $a fait dans un premier temps référence à $b jusqu'à ce que $a soit modifié. Cela est un mécanisme interne à Php, et donc il n'y aurait pas de duplication de données, donc pas de perte de mémoire (si ce n'est celle qui précise que $a est référence temporaire de $b, ce qui occupe la même place que pour une référence explicite).

Pour ma part, je n'utilise même pas les références dans un foreach (j'utilise la $key), mais il m'arrive de le faire pour certaines fonctions. De façon globale, je ne les utilise quasiment pas (car ce n'est pas le rôle, en général, d'une méthode ou d'une fonction de modifier une valeur, mais bien d'en retourner une, sauf pour les procédures).
plus d'infos d'ici :
http://fr2.php.net/manual/fr/features.g ... cycles.php
http://julien-pauli.developpez.com/tuto ... variables/
:wink:

Eléphant du PHP | 314 Messages

28 janv. 2011, 12:44

P*ta*n, j'en apprend des choses avec ce topic : )

Merci pour tous ces liens !!
Cordialement,
Julien - http://laravel.fr/

Eléphant du PHP | 275 Messages

28 janv. 2011, 15:31

les objets sont de tout façon forcement en référence, c'etait pas le cas en PHP 4 c'est pour ca qu'on voit des lib avec des =& partout et des & fonction, bref des & a toutes les sauces.
Sauf que les références implicites objet ne fonctionnent pas comme les référence explicites. Ex:
$a = new stdClass();
$b = $a;
$b = null;
Cet exemple ne détruira pas l'objet, parce que la valeur de b est en quelque sorte un "pointeur" vers l'objet (et pas l'objet en lui même), donc $b = null écrase ce "pointeur". Avec $b = &$a;, l'objet aurait été détruit (et donc $a vaudrait null)