|
5.3.3.3 Les références avec les variables global et static
Le Zend Engine 1, sur qui repose PHP 4, implémente les
options
static
et
global
pour les variables, en terme de références. Par exemple, une vraie
variable globale est importée dans un contexte de fonction avec
global
.
Cette commande crée en fait une référence sur la variable globale. Cela
peut vous mener à des comportements inattendus, par exemple :
| Les variables statiques et les références |
<?php function test_global_ref() { global $obj; $obj = &new stdclass; }
function test_global_noref() { global $obj; $obj = new stdclass; }
test_global_ref(); var_dump($obj); test_global_noref(); var_dump($obj); ?>
|
L'exemple ci-dessus va afficher :
NULL
object(stdClass)(0) {
}
Un comportement similaire s'applique à la commande
static
.
Les références ne sont pas stockées dynamiquement :
| Les variables statiques et les références (2) |
<?php function &get_instance_ref() { static $obj;
echo 'Objet statique : '; var_dump($obj); if (!isset($obj)) { // Assigne une référence à une variable statique $obj = &new stdclass; } $obj->property++; return $obj; }
function &get_instance_noref() { static $obj;
echo 'Objet statique : '; var_dump($obj); if (!isset($obj)) { // Assigne une objet à une variable statique $obj = new stdclass; } $obj->property++; return $obj; }
$obj1 = get_instance_ref(); $still_obj1 = get_instance_ref(); echo "\n"; $obj2 = get_instance_noref(); $still_obj2 = get_instance_noref(); ?>
|
L'exemple ci-dessus va afficher :
Objet statique : NULL
Objet statique : NULL
Objet statique : NULL
Objet statique : object(stdClass)(1) {
["property"]=>
int(1)
}
Ces exemples illustrent les problèmes rencontrés lors de l'assignation
de référence à des variables statiques, qui sont
oubliées
lorsque vous appelez
&get_instance_ref()
une seconde fois.
|