2013-01-01 1 views
2

J'ai le code suivant snipplet:(), si et évaluation de court-circuit

$active_from = '31-12-2009'; 
if(list($day, $month, $year) = explode('-', $active_from) 
    && !checkdate($month, $day, $year)) { 
    echo 'test'; 
} 

Pourquoi suis-je une erreur variable non définie?

list($day, $month, $year) = explode('-', $active_from) renvoie true, donc list() est évalué, n'est-ce pas? Je pense, les variables devraient être définies? Qu'est-ce que je supervise?

Cela ne à mon avis même et plaids aucune erreur:

$active_from = '31-12-2009'; 
list($day, $month, $year) = explode('-', $active_from); 
if(checkdate($month, $day, $year)) { 
    echo 'test'; 
} 

Cela soulève aucune erreur:

if((list($day, $month, $year) = explode('-', $active_from)) && checkdate($month, $day, $year)) { 

Mais je ne comprends vraiment pas pourquoi :-)

Merci pour l'explication

+2

aucune erreur ici http://codepad.org/33BV3EsO –

Répondre

3

Ceci est une question de operator precedence, dans votre cas, le && évalue avant la =, conduisant à des erreurs que vous décrivez.

Vous pouvez résoudre ce problème en plaçant l'instruction d'affectation entre parenthèses.

Explicitement, votre code doit lire

if( (list($day, $month, $year) = explode('-', $active_from)) 
    && !checkdate($month, $day, $year)) { 

Notez que je l'ai changé if($a=$b && $c)-if(($a=$b) && $c). Les parenthèses forcent l'opérateur d'affectation (=) à évaluer avant la conjonction (&&), ce que vous voulez.

+0

vous remercie beaucoup :) –

+0

Aucun problème, @FabianBlechschmidt. (Et bonne année ;-)) – Richard

1

En savoir plus sur operator precedence.

if (list($day, $month, $year) = explode('-', $active_from) && !checkdate($month, $day, $year)) { 

est identique à

if (list($day, $month, $year) = (explode('-', $active_from) && !checkdate($month, $day, $year))) { 
+0

vous remercie beaucoup :) –