D'ailleurs pour être exact même en PHP 5 les objets ne sont pas passés par référence. On transmet un identifiant qui fait référence à un objet. La différence c'est que chaque variable a sa propre copie de cet identifiant en tant que valeur. Redéfinir une variable n'impacte pas les autres qui ont aussi cet objet en valeur.
function modifie($a) { $a = 3 ; }
$b = new StdClass() ;
$b->hello = 2 ;
modifie($b) ;
echo $b ; // ... c'est un objet qu'on tente d'afficher, pas "3"
Alors que pour une vraie référence :
function modifie(&$a) { $a = 3 ; }
$b = new StdClass() ;
$b->hello = 2 ;
modifie($b) ;
echo $b ; // ... c'est 3 qu'on affiche
> Pourtant, la question laisse penser qu'il existe une différence implicite (a la java ou les scalaires diffèrent des objets).
Il y en a une.
function modifie($a) { $a->hello = 4 ; }
$b = new StdClass() ;
$b->hello = 2 ;
modifie($b) ;
echo $b->hello ; // donne 2 en PHP 4 (tout est passé par copie) et 4 en PHP 5 (les objets ont un traitement spécial, différent des scalaires)
(codes non testés donc probablement bourrés d'erreurs, mais le principe est là).
[^] # Re: Inquiétudes
Posté par Éric (site web personnel) . En réponse à la dépêche IP-formation : la formation administrateur Linux menacée. Évalué à 4.
function modifie($a) { $a = 3 ; }
$b = new StdClass() ;
$b->hello = 2 ;
modifie($b) ;
echo $b ; // ... c'est un objet qu'on tente d'afficher, pas "3"
Alors que pour une vraie référence :
function modifie(&$a) { $a = 3 ; }
$b = new StdClass() ;
$b->hello = 2 ;
modifie($b) ;
echo $b ; // ... c'est 3 qu'on affiche
> Pourtant, la question laisse penser qu'il existe une différence implicite (a la java ou les scalaires diffèrent des objets).
Il y en a une.
function modifie($a) { $a->hello = 4 ; }
$b = new StdClass() ;
$b->hello = 2 ;
modifie($b) ;
echo $b->hello ; // donne 2 en PHP 4 (tout est passé par copie) et 4 en PHP 5 (les objets ont un traitement spécial, différent des scalaires)
(codes non testés donc probablement bourrés d'erreurs, mais le principe est là).