4.3.3.3 Les références avec la 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. Ce
peut vous mener à des comportement inattendus, comme 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); ?>
|
Exécuter cet exemple vous donnera :
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(); ?>
|
Exécuter cet exemple vous donnera :
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.
|