2010-08-05 13 views
7

PHP or è una parola chiave strana. Eccolo in uno snippet di codice che mi fa confondere:Gli strani modi del "o" in PHP

echo 0 or 1; // prints 1 

$foo = (0 or 1); 
echo $foo; // prints 1 

$foo = 0 or 1; 
echo $foo; // prints 0 for some reason 

Perché l'ultimo stampa 0 e non 1?

+0

Le persone scrivono effettivamente la parola "o" invece di due pipe? – Incognito

+1

Sicuro.Le parole (come "o") in genere hanno più senso per le persone rispetto alle combinazioni di simboli rari (come "||"). –

risposta

21

Questo a causa della diversa priorità operatore. Nel terzo caso, l'incarico viene gestito per primo. Sarà interpretato in questo modo:

($foo = 0) or 1; 

L'operatore || ha una precedenza differente. Se si utilizza

$foo = 0 ||1; 

Funzionerà come previsto.

Vedi l'manual on logical operators

+0

L'avrei scritto come '$ foo = (0 o 1);' – Treffynnon

+0

@Trefynnon: No, 'o' ha precedenza più bassa di' = '. Se dovessi usare '||' avresti ragione. – nico

+0

@Treffynnon: Ma questa sarebbe una dichiarazione diversa. – You

4

E '($foo = 0) or 1;. or ha uno operator precedence inferiore a =.

In questo caso è necessario utilizzare ||, poiché ha una precedenza superiore a = e pertanto valuterà come previsto.

5

No, non lo farei, è perché di operator precedence:

$foo = 0 or 1; 
// is same as 
($foo = 0) or 1; 
// because or has lower precedence than = 

$foo = 0 || 1; 
// is same as 
$foo = (0 || 1); 
// because || has higher precedence than = 

// where is this useful? here: 
$result = mysql_query() or die(mysql_error()); 
// displays error on failed mysql_query. 
// I don't like it, but it's okay for debugging whilst development. 
0

IIRC, l'operatore di assegnazione (=) ha la precedenza maggiore di or. Così, l'ultima riga sarebbe stata interpretata come:

($foo = 0) or 1; 

che è una dichiarazione che assegna 0-$foo, ma restituisce 1. La dichiarazione pugno viene interpretato come:

echo(0 or 1); 

An come ad esempio stamperà 1.

0

Ordine di operazioni. La parola "o" ha una precedenza molto più bassa rispetto al "||" corrispondente. Inferiore, pari, rispetto all'operatore di assegnazione. Quindi l'assegnazione avviene prima, e il valore dell'assegnazione è il primo operando al "o".

"o" è più significato per il controllo di flusso che per le operazioni logiche. Ti consente di dire qualcosa come

$x = get_something() or die("Couldn't do it!"); 

se get_something è codificato per restituire false o 0 in caso di errore.

0

Nei primi due snippet, si sta confrontando 0 o 1 (essenzialmente vero o falso). Nel terzo snippet si assegna 0, che funziona, e quindi è vero, quindi la condizione o non viene eseguita. testo enfatizzato

0

Nel terzo esempio, l'operatore = ha una precedenza maggiore di o, quindi viene eseguito per primo. || l'operatore, superficialmente uguale, ha una precedenza più alta di =. Come dici tu, interessante.