Question a propos d'une fonction

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Question a propos d'une fonction

Re: Question a propos d'une fonction

par sadeq » 20 janv. 2011, 12:56

Bonjour,

Le modificateur & situé juste avant un paramètre déclaré en entrée d'une fonction permet de passer ce paramètre par sa référence (ou adresse) au lieu de le passer par valeur. Autrement dit, un paramètre de type : & $param1 correspond à la base à une variable déclarée dans le programme appelant la fonction et cette dernière peut le modifier à volonté puisqu'il est passé par référence. Le passage normal de paramètres par valeur ne permet pas à la fonction de réécrire dans les variables originaires du programme appelant. Exemple:
// Fonction déclarée avec un paramètre à passer par référence
function incrementer(& $param1){
    $param1 ++; // ici $param1 se réfère à une variable passée à la fonction par le programme appelant
}

// Programme principal utilisant cette fonction
$var1 = 1; // variable locale au programme principal
echo "var1 avant l'appel de la fonction = " . $var1;

// passage de $var1 en tant que paramètre par référence à la fonction incrementer()
incrementer($var1);
echo "var1 après l'appel de la fonction = " . $var1; // ici $var1 a été modifiée par la fonction incrementer (la valeur résultat est 2)
Ici, la fonction incrementer(& $param1) se permet de modifier la variable $var1 passée par le programme principal via le paramètre $param1 car elle travaille avec l'adresse de $var1 dans la mémoire du programme principal.

NB. Contrairement, un passage par valeur (sans & avant $param1) n'octroie qu'un accès en lecture seule à la valeur passée à la fonction, c'est le cas normal.

Pour la deuxième question, le modificateur global permet de déclarer, au sein d'une fonction, un accès aux variables du contexte du programme appelant et c'est la même chose que $GLOBALS sauf que ce dernier est un tableau/variable superglobale (vu par défaut dans tous les contextes de PHP comme $_POST, $_GET, $_SESSION, $_ENV...)

[EDIT: Voir l'exemple précédent de xTG ]

Il faut lire un p'tit peu sur la portée des variables dans les différents contextes d'un programme procédural

Re: Question a propos d'une fonction

par xTG » 20 janv. 2011, 12:32

Le & indique une variable par référence, en gros elle ne sera pas retournée par copie, seule son adresse sera renvoyé et cela ferra le lien vers la valeur.
Dans le cas de ta fonction c'est pour le return.

Le mot clé global indique que la variable se trouve en dehors de la fonction.
Exemple :
$var_global = "test";
function test_sans_global(){
  echo $var_global; // renverra un warning
}
function test_global(){
  global $var_global;
  echo $var_global; // affichera test
}

Question a propos d'une fonction

par laresistance2 » 20 janv. 2011, 11:28

Bonjour,
J'ai deux questions à propos d'une fonction reprise de wordpress

1) Je me demande à quoi sert les &
dans le non de la fonction, son paramètre, avant la déclaration d'une variable etc.
2) Je me demande à quoi sert le global à la deuxième ligne de la fonction
je connaissais la variable $GLOBALS mais pas global
function &get_comment(&$comment, $output = OBJECT) { 
 global $wpdb; 
 $null = null; 

 if ( empty($comment) ) { 
  if ( isset($GLOBALS['comment']) ) 
   $_comment = & $GLOBALS['comment']; 
  else 
   $_comment = null; 
 } elseif ( is_object($comment) ) { 
  wp_cache_add($comment->comment_ID, $comment, 'comment'); 
  $_comment = $comment; 
 } else { 
  if ( isset($GLOBALS['comment']) && ($GLOBALS['comment']->comment_ID == $comment) ) { 
   $_comment = & $GLOBALS['comment']; 
  } elseif ( ! $_comment = wp_cache_get($comment, 'comment') ) { 
   $_comment = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment)); 
   if ( ! $_comment ) 
    return $null; 
   wp_cache_add($_comment->comment_ID, $_comment, 'comment'); 
  } 
 } 

Merci d'avance