82 votes

Normes strictes: seules les variables doivent être transmises par référence

 $el = array_shift($instance->find(..))
 

Le code ci-dessus signale en quelque sorte l'avertissement de standard strict, mais cela ne va pas:

 function get_arr(){
    return array(1,2);
}
$el = array_shift(get_arr());
 

Alors, quand va-t-il signaler l'avertissement quand même?

93voto

leepowers Points 16420

Considérons le code suivant:

error_reporting(E_STRICT);
class test {
    function test_arr(&$a) {
        var_dump($a);   
    }
    function get_arr() {
        return array(1,2);  
    }
}

$t= new test;
$t->test_arr($t->get_arr());

Cela génère la sortie suivante:

Strict Standards: Only variables should be passed by reference in test.php on line 14
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(2)
}

La raison? L' test::get_arr() méthode n'est pas une variable et en vertu de la mode strict, cela va générer un message d'avertissement. Ce comportement est extrêmement intuitif, comme l' get_arr() méthode retourne un tableau de valeur.

Pour contourner cette erreur en mode strict, soit de changer la signature de la méthode afin de ne pas utiliser une référence:

function test_arr($a) {
    var_dump($a);  
}

Puisque vous ne pouvez pas modifier la signature d' array_shift vous pouvez aussi utiliser une variable intermédiaire:

$inter= get_arr();
$el= array_shift($inter);

7voto

Sagi Points 5590

$instance->find() rendements de référence pour la variable.

Vous obtenez le rapport lorsque vous essayez d'utiliser cette référence comme un argument à la fonction, sans le stocker à la première variable.

Cela permet de prévenir les fuites de mémoire, et deviendra probablement d'erreur dans les prochaines versions de PHP.

Votre 2ème code jeter erreur s'il écrit comme (notez les et en fonction de la signature):

function &get_arr(){
    return array(1,2);
}
$el = array_shift(get_arr());

Ainsi, un rapide (et pas très agréable) correctif serait:

$el = array_shift($tmp = $instance->find(..));

Fondamentalement, vous faites une affectation de variable temporaire d'abord, et envoyer la variable comme argument.

3voto

user187291 Points 28951

Le deuxième extrait ne fonctionne pas non plus et c'est pourquoi. array_shift est une fonction de modification qui modifie son argument. Par conséquent, il s'attend à ce que son paramètre soit une référence et vous ne pouvez pas faire référence à quelque chose qui n'est pas une variable. Voir les explications de Rasmus ici: http://bugs.php.net/bug.php?id=48937

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