2012-03-29 17 views
8

Perché non funzionerà? Appare Errore di analisi: errore di sintassi, inaspettata ':' ... on line 7if {} in if: endif

$a = 0; $b = 1; $c = 3; $d = 4; 
if ($a == $b): 
    if ($b == $c) { 
     // something 
    } 
else: 
    $c = $a; 
endif; 

Ma se cambio a (appena aggiunto istruzione else):

$a = 0; $b = 1; $c = 3; $d = 4; 
if ($a == $b): 
    if ($b == $c) { 
     // something 
    } else { 
     // something 
    } 
else: 
    $c = $a; 
endif; 

Funziona benissimo.

Perché è quello? non è un bug PHP? O c'è una regola se ... dovrei saperlo?

In ogni caso, sto usando la versione di PHP 5.3.3.

+0

Si prega di incollare i numeri di riga – JAM

+0

http://stackoverflow.com/questions/564130/difference-between-if-and-if-endif – Pheonix

+4

Interessante - e una buona illustrazione del motivo per cui probabilmente non si dovrebbe mescolare il flusso di stili di template dichiarazioni di controllo con quelle regolari rinforzate. (o usa lo stile di template _at all_ a meno che tu non stia codificando una visualizzazione HTML ... ma questa è un'opinione) –

risposta

14

Non sono sicuro se io lo definirei questo un bug, ma credo che stai avendo questo problema a causa di un dangling else, in combinazione con il misto else if-sintassi:

if ($a == $b):   // 1 
    if ($b == $c) {  // 2 
     // something  // 3 
    }      // 4 
else:      // 5 - this else 
    $c = $a;    // 6 
endif;     // 7 

Si noti come il else sulla linea 5 è ambiguo: potrebbe "appartenere" alla prima o alla seconda affermazione if.

Si può facilmente rimuovere tale ambiguità e risolvere il tuo errore di sintassi con l'aggiunta di un punto e virgola dopo la vostra nidificato if:

if ($a == $b):   // 1 
    if ($b == $c) {  // 2 
     // something  // 3 
    };     // 4 - here 
else:      // 5 
    $c = $a;    // 6 
endif;     // 7 

In un'altra nota, si prega di non utilizzare questa sintassi se non volete che i vostri compagni di programmatori di Bludgeon a morte nel sonno.

+0

+1 per i lol dalla nota – jprofitt

+0

su cosa stavo per scrivere. Solo meglio :) – GolezTrol

+0

Grazie per il vostro consiglio. Non mixerò la sintassi. è solo una piccola meraviglia che si trasforma in questione. – user1301744

0

La forma dei due punti del if/else può essere ambigua quando si ha a che fare con if annidati. Nel tuo esempio il secondo è collegato al secondo se (come dovrebbe.) Per evitare ciò devi esplicitamente far sapere all'interprete che quel altro è accoppiato con il primo se, aggiungendo un altro al secondo se (come mostrato nel secondo blocco di codice) o usando {} per definire esplicitamente il flusso di controllo.

In altre parole, è possibile utilizzare più forme di istruzioni if. Ad esempio:

if (foo): 
    //statements 
else { 
    //statements 
} 

È perfettamente valido. Anche se consiglierei di non mescolare i moduli in quanto elimina la leggibilità.