L'opérateur =&

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : L'opérateur =&

Re: L'opérateur =&

par popy » 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)

Re: L'opérateur =&

par AoSiX » 28 janv. 2011, 12:44

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

Merci pour tous ces liens !!

Re: L'opérateur =&

par stealth35 » 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:

Re: L'opérateur =&

par devlop78 » 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).

Re: L'opérateur =&

par AoSiX » 27 janv. 2011, 16:24

Ah c'est vachement intéressant, merci pour ces explications !

Re: L'opérateur =&

par stealth35 » 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);

Re: L'opérateur =&

par AoSiX » 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 ?

Re: L'opérateur =&

par stealth35 » 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.

Re: L'opérateur =&

par AoSiX » 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 :/

Re: L'opérateur =&

par stealth35 » 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.

L'opérateur =&

par AoSiX » 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 ? )