Bizarrerie PHP: copie par référence d'office!
falymarc
-
falymarc -
falymarc -
Bonjour à tous,
Je vous soumets aujourd'hui une petite bizarrerie de PHP (5.3.5) que je viens de découvrir en travaillant: en gros, la copie d'un tableau d'objets est une copie par référence d'office. Voici une illustration:
C'est vrai qu'en y réfléchissant bien on arrive à y dégager une certaine logique comme quoi le mot-clé "new" renvoi une référence vers l'objet créé et que donc la copie du tableau ramène à l'objet. Mais sur le coup ce qu'on obtient n'est pas ce qu'on aurait voulu. C'est le genre de chose qui peut vous bloquer pendant des heures :)
Bonne journée à tous
Je vous soumets aujourd'hui une petite bizarrerie de PHP (5.3.5) que je viens de découvrir en travaillant: en gros, la copie d'un tableau d'objets est une copie par référence d'office. Voici une illustration:
<?php $arr = array( new stdClass, new stdClass, new stdClass ); $arr[0]->hello = 'test'; $arr2 = $arr; $arr2[ 0 ]->hello = 'copie'; echo $arr2[ 0 ]->hello."<br/>"; echo $arr[ 0 ]->hello."<br/>"; $arr = array( 'rien', 'rien', 'rien' ); $arr2 = $arr; $arr2[ 0 ] = 'quelque chose'; echo $arr2[ 0 ]."<br/>"; echo $arr[ 0 ]; ?>
C'est vrai qu'en y réfléchissant bien on arrive à y dégager une certaine logique comme quoi le mot-clé "new" renvoi une référence vers l'objet créé et que donc la copie du tableau ramène à l'objet. Mais sur le coup ce qu'on obtient n'est pas ce qu'on aurait voulu. C'est le genre de chose qui peut vous bloquer pendant des heures :)
Bonne journée à tous
A voir également:
- Bizarrerie PHP: copie par référence d'office!
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Retour à la ligne php ✓ - Forum PHP
- Alert php - Forum PHP
- Retour a la ligne php ✓ - Forum PHP
2 réponses
Bonjour,
Je ne vois rien de bizarre là dedans.
Les objets sont copiés par référence, copie des pointeurs, les autres varaibles sont des clonages (allocation d'un nouvel espace mémoire).
Tout d'abord vous instanciez un tableau d'objets.
Donc en le copiant, vous copiez les références objet, logique, pas d'appel à une méthode clone, donc ce sont les mêmes objets
Puis vous remplacez le tableau d'objets par un tableau de chaînes
$arr = array( 'rien', 'rien', 'rien' ); et vous copiez se tableau dans $arr2
là PHP ne travaille plus sur des objets, donc il crée de nouvelles références (des chaînes différentes).
Donc quand vous modifiez un élément de $arr2, vous n'affectez plus $arr, ses élements n'étant que des copies et ne pointant plus sur la même référence?
Je ne vois rien de bizarre là dedans.
Les objets sont copiés par référence, copie des pointeurs, les autres varaibles sont des clonages (allocation d'un nouvel espace mémoire).
Tout d'abord vous instanciez un tableau d'objets.
Donc en le copiant, vous copiez les références objet, logique, pas d'appel à une méthode clone, donc ce sont les mêmes objets
Puis vous remplacez le tableau d'objets par un tableau de chaînes
$arr = array( 'rien', 'rien', 'rien' ); et vous copiez se tableau dans $arr2
là PHP ne travaille plus sur des objets, donc il crée de nouvelles références (des chaînes différentes).
Donc quand vous modifiez un élément de $arr2, vous n'affectez plus $arr, ses élements n'étant que des copies et ne pointant plus sur la même référence?