32 votes

Problème de passage par référence avec PHP 5.3.1

Ok, c'est un problème bizarre, alors soyez indulgents avec moi pendant que j'explique.

Nous avons mis à jour nos serveurs de développement de PHP 5.2.5 à 5.3.1.

En chargeant notre code après le switch, nous commençons à obtenir des erreurs comme :

Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in /home/spot/trunk/system/core/Database.class.php on line 105

la ligne mentionnée (105) est la suivante :

call_user_func_array(Array($stmt, 'bind_param'), $passArray);

nous avons remplacé la ligne par la suivante :

call_user_func_array(Array($stmt, 'bind_param'), &$passArray);

à ce stade (parce que allow_call_time_pass_reference ) est désactivé, php envoie ce message :

Deprecated: Call-time pass-by-reference has been deprecated in /home/spot/trunk/system/core/Database.class.php on line 105

Après avoir essayé de résoudre ce problème pendant un certain temps, j'ai décidé de mettre en place un système de gestion de l'information. allow_call_time_pass_reference au sujet de.

Cela a permis de se débarrasser de la Deprecated mais aujourd'hui, le Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference L'avertissement est lancé à chaque fois, avec ou sans le référencement.

Je n'ai aucune idée de la façon de résoudre ce problème. Si la méthode cible était la mienne, je référencerais simplement les vars entrantes dans la déclaration func, mais il s'agit d'une méthode (relativement) native (mysqli).

Quelqu'un a-t-il déjà vécu cela ? Comment puis-je y remédier ?

Nous vous remercions.

45voto

Dominic Points 341

Je viens de rencontrer le même problème, en appelant bind_param via call_user_func_array et en passant un tableau de paramètres. La solution consiste à modifier les valeurs du tableau à référencer. Ce n'est pas très élégant, mais cela fonctionne.

call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($passArray));

function makeValuesReferenced($arr){
    $refs = array();
    foreach($arr as $key => $value)
        $refs[$key] = &$arr[$key];
    return $refs;

}

16voto

Zak Points 10160

Vous passez un tableau d'éléments ($passArray). Le deuxième élément à l'intérieur le tableau transmis doit être une référence, puisqu'il s'agit en fait de la liste des éléments que vous transmettez à la fonction.

6voto

Andrew Moore Points 49765

En fait, il faut savoir qu'il y a un bogue avec PHP 5.3.1 concernant les références et toutes les références. call famille de fonctions :

Bugs PHP #50394 : Argument de référence converti en valeur dans __call

Le comportement que vous observez peut être le résultat de ce bogue et toute tentative de le corriger au niveau du code peut entraîner des problèmes à long terme.

Le problème a été corrigé dans la version SVN de PHP. Jusqu'à la sortie de la version 5.3.2, vous pouvez compiler une nouvelle version pour l'utiliser, ou revenir à une version antérieure.

3voto

leek Points 4668

Nous avons rencontré le même problème avec ce code :

call_user_func(array($strCartHandler, 'CartPurchaseEvent'), $strCartEvent, $objToUser, null, $this);

Ma solution a été de sauter call_user_func et de faire ceci :

$strCartHandler::CartPurchaseEvent($strCartEvent, $objToUser, null, $this);

2voto

Louis Points 1500

Je pense que ce qui est déprécié, c'est le passage d'une référence par une fonction. Dans la définition de la fonction, vous faites quelque chose comme

function(&$arg) {

}

Cela ne vous aide pas beaucoup, mais vous n'avez probablement pas besoin de passer la référence de toute façon. Je suppose que vous pourriez essayer une fonction d'enveloppe.

function wrapper($stmt, &$passArray) {
    call_user_func_array($stmt, $passArray);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X