2011-01-20 11 views
7

In JavaScript, l'operatore == non è necessariamente transitiva:L'operatore == è transitivo in PHP?

js> '0' == 0 
true 
js> 0 == '' 
true 
js> '0' == '' 
false 

È lo stesso vale in PHP? Puoi fare un esempio?

+0

http://se2.php.net/manual/en/language.operators.comparison.php – vichle

+0

Gli stessi campioni possono essere eseguiti nella php con gli stessi risultati . – zerkms

+0

@zerkms: tutti di em? Le stringhe e gli interi e tutte quelle stranezze danno lo stesso risultato? Non solo questo? – mpen

risposta

14

No, l'operatore == non è transitivo.

Lo stesso identico scenario dà lo stesso risultato in PHP.

echo var_dump('0'==0); 
echo var_dump(0==''); 
echo var_dump('0'==''); 

rendimenti:

boolean true 
boolean true 
boolean false 
+1

Sì. La ragione di ciò è dovuta al fatto che l'operando di destra è tipizzato nel tipo di dati dell'operando di sinistra. '0' typecast a una stringa diventa' '0'', '' '' typecast a un int diventa '0', ma'' ''è già una stringa, quindi viene confrontato direttamente con'' 0'' e trovato non uguale. Anche se i motivi esatti in javascript sono leggermente diversi. – keithjgrant

+2

era quello che dovrebbe essere un aggiornamento la tua domanda? – Gordon

+3

-1 Perché stai rispondendo alla tua stessa domanda? (Se conoscessi la risposta, perché chiederla?) Senza offesa, ma con un rep di> 10K dovresti davvero conoscere meglio e le domande "mostra e racconta" non sono realmente accettabili. –

2

Lo stesso vale in PHP:

//php 

'0'==0 //true 
0=='' //true 
''=='0' //false 

non hai testare voi stessi? Queste sono le stesse dichiarazioni che hai fornito per javascript.

+1

Sì, l'ho fatto. Un secondo dopo averlo postato. Vedi la mia risposta. È stato uno spin-off di questa domanda: http://stackoverflow.com/questions/4752579/are-all-php-equality-comparisons-reflexive Chiesto per completezza e sensibilizzare altri SO-erers ... non è davvero intuitivo. – mpen

+0

+1 btw. Probabilmente lo stai scrivendo allo stesso tempo. – mpen

+0

@Mark: Cool. Hai fatto +1 sulla tua risposta, non c'è niente di sbagliato nel farlo. – Cam

1
array() == NULL // true 
0 == NULL  // true 
array() == 0 // false 

Il problema con linguaggi di scripting è che iniziamo a confronto le cose in modo non rigoroso, che porta a sensi diversi di "uguaglianza". quando si confrontano "0" e 0, si intende qualcosa di diverso quando si confronta "0" e NULL. Quindi ha senso che questi operatori non siano transitivi. Reflexivity tuttavia, dovrebbe essere un invariante. L'uguaglianza è per definizione riflessiva. Non importa in che senso intendi l'uguaglianza, dovrebbe sempre essere vero che A è uguale a se stesso.

altro più ovvia:

true == 1 // true 
true == 2 // true 
1 == 2 // false 
+0

'0 == null' valuta per' true' per me. – mpen

+0

Ah, mio ​​errore, ho provato con '===' per l'ultimo senza rendermene conto. Ecco un altro – Nacht

+0

"ha senso che questi operatori non sarebbero transitivi" - solo se inclini la testa e la guardi in un modo strano. Nessuno dei tuoi esempi ha senso per me; Penso che dovrebbero restituire "null" invece o l'errore. Nella tua ultima frase, intendi se 'A == B' implica' B == A'? Ma se PHP può infrangere altre leggi della logica, non mi sorprenderebbe se anche questo non fosse sempre vero. – mpen