2009-12-15 15 views
6

La fonction ci-dessous génère l'erreur lorsqu'une fonction contient des arguments mentionnés par exemple:PHP: call_user_func_array: passer par numéro de référence

function test(&$arg, &$arg2) 
{ 
    // some code 
} 

Maintenant, je ne peux pas utiliser call_user_func_array pour la fonction ci-dessus, il va générer une erreur.

Comment résoudre ce problème?

J'ai besoin d'utiliser call_user_func_array. Supposons également que je ne sais pas à l'avance si elles sont passées par référence ou passées par valeur.

Merci

+4

Il vaudrait la peine de ne pas accepter la réponse actuelle car elle est littéralement fausse (sans parler de mauvais conseils en abusant d'objets qui changent complètement la sémantique du problème): http: //codepad.viper-7 .com/j3GOps – ircmaxell

Répondre

7

Une grande solution a été publiée sur http://www.php.net/manual/de/function.call-user-func-array.php#91503

function executeHook($name, $type='hooks'){ 
    $args = func_get_args(); 
    array_shift($args); 
    array_shift($args); 
    //Rather stupid Hack for the call_user_func_array(); 
    $Args = array(); 
    foreach($args as $k => &$arg){ 
     $Args[$k] = &$arg; 
    } 
    //End Hack 
    $hooks = &$this->$type; 
    if(!isset($hooks[$name])) return false; 
    $hook = $hooks[$name]; 
    call_user_func_array($hook, $Args); 
} 

Le hack réel est entouré par des commentaires.

+1

merci l'homme, m'a sauvé la vie! c'est certainement la bonne réponse – Mangiucugna

+0

Cheesus, merci! – maryisdead

+0

Spoke too soon ... Bien que cela supprime l'erreur, il ne me laisserait pas manipuler la variable référencée à l'intérieur de l'appelable. – maryisdead

21

Lorsque vous enregistrez vos paramètres dans le tableau, assurez-vous stockez une référence à ces paramètres, il devrait fonctionner correctement.

Ie:

call_user_func_array("test", array(&param1, &param2)); 
+2

mais que se passe-t-il si je ne sais pas à l'avance si elles sont passées par référence ou passées par valeur? – Sarfraz

+1

Ensuite, trouver un moyen de déterminer cela, ou les faire tous passer par référence serait ma suggestion. Pas grand-chose d'autre que tu peux faire, j'ai peur. – Myles

+0

Myles: que se passe-t-il si je ne connais pas la quantité d'arguments dans le tableau? – ymakux