Articles

Le mois de la fonction PHP : des variables à la pelle

  • Ecrit par Damien Seguy
  • mercredi 25 avril 2007
Image pour le titre du contenu

This document is also available in English en 


Les variables variables font partie des outils qui rendent PHP si dynamique. Le nom d'une variable, sous forme de chaîne de caractères, est suffisant pour manipuler cette variable. Il suffit de multiplier les dollars.


<?php
$a = 'b';
$b = 'c';
$c = 'd';
 
 
echo $$$a; 
// affiche d
?>

Cet outil est particulièrement utile pour les bibliothèques qui doivent manipuler des variables qui seront elles-mêmes définies par l'utilisateur. L'utilisateur donne alors le nom de la variable sous forme de chaîne, et la bibliothèque est capable d'accéder directement aux valeurs, via une sorte de double déréférencement.

D'ailleurs, quand les variables deviennent très nombreuses, on les rassemble dans un tableau, et on les traite avec une boucle.

<?php
 
 
$variables = array('a' => 'A', 'b' => 'B', 'c' => 'C');
 
 
extract($variables);
 
 
?>

extract() utilise le tableau pour créer des variables. Elle utilise la clé comme nom de variable finale, et la valeur associée comme valeur de la variable. L'exemple ci-dessus revient exactement à ceci :

<?php
 
 
$variables = array('a' => 'A', 'b' => 'B', 'c' => 'C');
 
 
foreach($variables as $nom => $valeur) {
    $$nom = $valeur;
}
 
 
?>

Le tableau argument de extract() doit être indexé avec des chaînes de caractères. Si l'index du tableau ne peut pas servir de nom de variable valide, la variable ne sera tout simplement pas créée.

La génération de variable peut être adaptée aux circonstances grâce au deuxième argument. Notamment, il est possible d'imposer un préfixe aux noms de variables qui seront créées, ou d'interdire l'écrasement de variables existantes. Il est aussi possible de produire des références et non pas de nouvelles variables.

<?php
 
 
$variables = array('_GET' => 'A');
 
 
extract($variables, EXTR_IF_EXISTS, 'extract');
// cette extraction &eacute;vite d'&eacute;craser la variable _GET si elle existe d&eacute;j&agrave;
?>

Le contraire de extract() est la fonction compact. Elle prend le nom des variables sous forme de chaîne, et retourne un tableau avec le nom des variables comme index, et leur valeur associée.

<?php
$a = 'b';
$b = 'c';
$c = 'd';
 
 
print_r(compact(array('a',$b, 'd')));
 
 
/*
Array
(
    [a] => b
    [c] => d
)
// $d n'existe pas
*/
?>

compact() prend le nom de la variable et non pas la variable elle-même. Ici, c'est la variable $c qui est utilisée par compact() et non pas $b. Après quelques erreurs, vous vous souviendrez de ce petit tout de passe-passe.

extract() et compact() sont très pratiques pour gérer des situations ou le nombre d'argument à faire passer entre deux fonctions est très grand, ou même connu uniquement durant l'exécution. C'est aussi pratique pour gérer les cas où les arguments peuvent être optionnels ou pas.

<?php
 
 
/// code principal qui cr&eacute;e $b et $c
$args = compact(array_flip(range('a','d'));
 
 
$return = fonction($args);
 
 
extract($return); // avec remplacement des valeurs du corps principal
 
 
function fonction($args) {
  extract($args);
  // modification des variables
  
  return compact(array_flip(range('a','d'));
}
?>

A mémoriser
  • Les variables créées dans le corps du script central seront des variables globales. Celles qui sont créées dans le corps d'une fonction seront locales.
  • N'utilisez pas extract() sur $_GET et consoeurs, car cela revient à simuler register_globals
  • Utilisez extract() sur des tableaux que vous maîtrisez totalement. Si les données peuvent être modifiées depuis l'extérieur, alors toutes vos variables sont en péril.

< Précédent   Suivant >

Commentaires

Vous pouvez ajouter votre commentaire!


Vous devez vous connecter pour commenter