2009-10-09 10 views
6

Je veux appeler une fonction avec call_user_func_array mais j'ai remarqué que si un argument est une référence dans la définition de la fonction et est une valeur simple dans call_user_func_array, l'avertissement suivant apparaît: Attention: Le paramètre 1 à tester() devrait être un référence, la valeur donnéePHP Comment savoir si une variable est une référence?

Voici un exemple simple de ce que je suis en train de faire:

<?php 
$a = 0; 
$args = array($a); 
function test(&$a) { 
    $a++; 
} 
$a = 0; 
call_user_func_array('test', $args); 
?> 

Ma question est: comment puis-je savoir si une valeur (dans ce cas, la première valeur de $ args) est une référence ou pas?

Répondre

2

Vérifiez les commentaires sur cette page de la documentation PHP:

http://php.net/manual/en/language.references.spot.php

+1

Tout ce que je vois est des fonctions pour vérifier si deux tableaux/objets/variables pointent vers la même zone de mémoire en modifiant l'un et vérifier si l'autre est modifié aussi. Dans mon code (pas l'exemple, le vrai), je n'ai que le tableau d'arguments et je veux savoir si un argument est une référence. De cette façon, je peux lancer une erreur si la fonction de rappel veut une référence et que le tableau contient une valeur simple. –

+0

Il déclenche déjà un avertissement, destiné aux développeurs. Quel genre d'erreur voulez-vous? Vous pouvez [définir un gestionnaire d'erreur personnalisé] (http://php.net/set_error_handler) si vous voulez modifier le comportement – cmbuckley

4

Non, le problème est que le premier paramètre de la fonction est passe par référence (ce qui signifie la fonction peut modifier l'argument la portée de l'appelant). Par conséquent, vous devez passer une variable ou quelque chose qui est affectable en tant que premier argument. Lorsque vous créez le tableau comme array($a), il copie simplement la valeur de la variable $a (qui est 0) dans un emplacement dans le tableau. Il ne renvoie en aucun cas à la variable $a. Et puis quand vous appelez la fonction, il est comme si vous faites cela, ce qui ne fonctionne pas:

test(0) 

Si vous voulez vraiment, vous pouvez mettre $a dans le tableau par référence, mais il est un peu difficile :

<?php 
$a = 0; 
$args = array(&$a); 
function test(&$a) { 
    $a++; 
} 
call_user_func_array('test', $args); 
?> 

En ce qui concerne la façon dont vous diriez, que l'élément de tableau est une référence ... qui est difficile. Vous pouvez faire var_dump() sur le tableau, et recherchez le symbole « & »:

> var_dump($args); 
array(1) { 
    [0]=> 
    &int(1) 
} 
+0

Oui, je sais que le code fonctionne de cette façon. Je voulais juste un moyen de m'assurer que le tableau $ args (qui peut contenir n'importe quoi, puisque dans mon code il est passé par une autre fonction) a été créé de cette façon afin d'éviter toute erreur quand j'appelle call_user_func_array. C'est pourquoi je voulais savoir comment vérifier si les variables du tableau étaient des références ou non. –

Questions connexes