2008-10-07 7 views
0

Je refactorisation du code PHP et a découvert que certaines combinaisons imbriquées desyntaxe mixte pour les structures de contrôle générant des erreurs de syntaxe

if() : 

et

if() { 

génèrent des erreurs de syntaxe. Ce n'est pas que je mélange normalement les deux, mais j'aime faire des vérifications de syntaxe fréquentes pendant que j'écris du code et j'ai continué à obtenir une erreur de syntaxe à cause de cela.

Exemple - génère une erreur de syntaxe:

if ($test == 1) : 
    if ($test2 == 'a') { 
    if ($test3 == 'A') { 
    } else { 
    } 
    } 
else : 
    echo 'test2'; 
endif; 

Exemple - ne génère pas d'erreur de syntaxe:

if ($test == 1) : 
    if ($test2 == 'a') : 
    if ($test3 == 'A') : 
    else : 
    endif; 
    endif; 
else : 
    echo 'test2'; 
endif; 

Quelqu'un pourrait-il s'il vous plaît me expliquer pourquoi le premier bloc de code génère une erreur?

Répondre

2

Ceci est une supposition sauvage puisque je ne suis pas familier avec la grammaire de PHP. Mais voilà:

Le problème est le second else. L'analyseur ne peut pas voir si ce else appartient au premier ou au second si (à compter du début). Dans votre deuxième exemple, il y a un endif qui fait que le second if -block sera terminé pour qu'il puisse faire l'analyse. Peut-être est-ce le fameux problème "dangling-else" déguisé?

+0

Cela ressemble au problème général, on dirait que l'interpréteur est juste confus par l'autre, bien qu'il ne devrait pas l'être car il est encore court 1} – UnkwnTech

2

Je ne sais pas pourquoi. Voici un PHP bug post connexe dans lequel un dev dit essentiellement, "juste ne le faites pas" :). Je n'ai pas utilisé le code source PHP dernièrement, mais si je devais faire une supposition, c'est parce que je n'ai pas vérifié la syntaxe alternative en passant récursivement les instructions if.

0

La seule chose que je peux dire ici est que le code est complètement illisible. Eviter: comme la peste. Utilisez la syntaxe familière de l'accolade de style C.

La qualité du code est fortement influencée par sa lisibilité, alors faites un effort pour le nettoyer, vous vous épargnerez un tas de bugs surprenants.

+0

Le code ci-dessus n'est qu'un exemple. Et oui, je suis d'accord - code lisible rend la vie beaucoup plus facile. Cependant, en ce qui concerne l'utilisation des accolades, je ne suis pas d'accord - à mon humble avis, le code est beaucoup plus lisible lorsque les structures de contrôle se terminent par des déclarations descriptives lik, endif, endfor, etc., qui nécessitent: – Bill

+0

Yep, familier est toujours une question d'opinion. Bien que je préfère les supports aussi :) –

1

Il fonctionne très bien si vous mettez un point-virgule après la dernière frisée Croisillon:

if ($test == 1) : 
    if ($test2 == 'a') { 
    if ($test3 == 'A') { 
    } else { 
    } 
    }; 
else : 
    echo 'test2'; 
endif; 
1

Indentation damnés, il est l'interprétation du premier exemple comme étant un si vous utilisez des accolades jumelés avec un autre en utilisant la syntaxe alternative . La cohérence est la règle générale ici et l'interprétation est ambiguë pour tout lecteur de toute façon, alors soit mettre dans le point-virgule comme suggéré dans les autres réponses, ou mieux encore ... nettoyer le code. C'est horrible!