Bonjour à tous,

En faisant un benchmark perso pour tester les performances entre un passage par copie et un passage par référence en PHP, je me suis trouvé face à une bizarrerie intéressante.

Ma configuration actuelle est :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
PHP Version	5.3.9-ZS5.6.0
Zend Framework Version	 1.11.11
J'ai fais un premier test de cette forme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
$tab1 = array_fill(0, 1000000, 'e');
 
$time_start = microtime(true);
$tab2 = $tab1;
$time_end = microtime(true);
 
$time = $time_end - $time_start;
 
echo 'Durée : '.$time.' secondes<br/>';
Et à ma grande surprise, j'ai obtenu :
Durée : 5.0067901611328E-6 secondes
quand la création du premier tableau prenait :
Durée : 0.14926791191101 secondes
C'était comme si par défaut $tab2 était une référence de $tab1.
Alors j'ai décidé de modifier $tab1 et de regarder $tab2 pour voir si il était modifié également.

Code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
$tab1 = array_fill(0, 1000000, 'e');
 
$time_start = microtime(true);
 
$tab2 = $tab1;
$tab1[14] = 'j';
 
$time_end = microtime(true);
$time = $time_end - $time_start;
echo 'Durée : '.$time.' secondes<br/>';
echo $tab2[14];
Et là, résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
Durée : 0.093044996261597 secondes
e
En commentant la ligne $tab1[14] = 'j';, je reviens à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Durée : 2.1457672119141E-6 secondes
C'est une optimisation cachée, que je trouve intéressante. J'aimerais savoir si c'est un mécanisme connu, défini par le langage, ou un mécanisme lié au moteur PHP de Zend ?

Si je comprend bien, une affection d'un tableau est faite par référence tant que les deux tableaux restent constants ?