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?
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?
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
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
era quello che dovrebbe essere un aggiornamento la tua domanda? – Gordon
-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. –
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.
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
+1 btw. Probabilmente lo stai scrivendo allo stesso tempo. – mpen
@Mark: Cool. Hai fatto +1 sulla tua risposta, non c'è niente di sbagliato nel farlo. – Cam
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 == null' valuta per' true' per me. – mpen
Ah, mio errore, ho provato con '===' per l'ultimo senza rendermene conto. Ecco un altro – Nacht
"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
http://se2.php.net/manual/en/language.operators.comparison.php – vichle
Gli stessi campioni possono essere eseguiti nella php con gli stessi risultati . – zerkms
@zerkms: tutti di em? Le stringhe e gli interi e tutte quelle stranezze danno lo stesso risultato? Non solo questo? – mpen