2012-09-26 9 views
101

Powiel możliwe:
php == vs === operator
How do the equality (== double equals) and identity (=== triple equals) comparison operators differ?PHP wyraża dwa różne ciągi być taka sama

Dlaczego następujący zwrot oświadczenie true?

"608E-4234" == "272E-3063" 

Próbowałem również tego z pojedynczymi cudzysłowami wokół ciągów. Jedynym sposobem mogę zmusić go do evaulate do false jest za pomocą operatora === zamiast ==

Moja jest PHP jest traktowanie go jako pewnego rodzaju równaniem ale wydaje się trochę dziwny przypuszczenie.

Czy ktoś może rozwinąć?

+5

echo 608E-4234 = 0; echo 272E-3063 = 0; 0 == 0 –

+3

co mówi http://php.net/strcmp? – Bokw

+14

[PHP jest słabo/luźno wpisane] (http://stackoverflow.com/questions/467871/what-is-a-loosely-typed-language). W zależności od kontekstu to, co twierdzisz, jest ciągiem znaków, jest czymś innym. Lepiej użyj '===', jeśli chcesz porównać ciągi. Poznaj swoich operatorów. – hakre

Odpowiedz

107

"608E-4234" to float number format, więc będą one numerowane, gdy będą porównywane.

608E-4234 i 272E-3063 obie będą float(0), ponieważ są za małe.

Dla == w PHP,

Jeśli porównać liczbę sznurkiem lub porównanie obejmuje ciągi liczbowe, to każdy łańcuch jest konwertowana na liczbę i porównanie wykonywana liczebnie.

http://php.net/manual/en/language.operators.comparison.php

Uwaga:

Co o zachowanie w javascript, który ma również zarówno == i ===?

Odpowiedź brzmi, że zachowanie różni się od PHP. W javascript, jeśli porównasz dwie wartości z tym samym typem, == jest taki sam jak ===, więc nie będzie można używać rzutowania do porównania z dwiema wartościami tego samego typu.

w JavaScript:

608E-4234 == 272E-3063 // true 
608E-4234 == "272E-3063" // true 
"608E-4234" == 272E-3063 // true 
"608E-4234" == "272E-3063" // false (Note: this is different form PHP) 

Więc w javascript, gdy wiesz, typ wyniku, można użyć == zamiast === zapisać jeden znak.

Na przykład typeof operator zawsze zwraca ciąg znaków, więc można po prostu użyć

typeof foo == 'string' zamiast typeof foo === 'string' bez szkody.

+4

Ważny bit z instrukcji na temat [porównania operatorów] (http://php.net/manual/en/language.operators.comparison.php): * Jeśli porównujesz liczbę z ciągiem ** lub porównanie obejmuje ciągi liczbowe **, następnie każdy ciąg jest konwertowany na liczbę i porównanie wykonywane numerycznie. * –

+26

Patrz także: http://phpsadness.com/sad/47 – nickgrim

+5

'Ciągi liczbowe' -> [Co.] (http: // tvtropes .org/pmwiki/pmwiki.php/Main/FlatWhat) Czy to nie utrudnia jeszcze pisania bezpiecznych aplikacji w PHP. –

5

Próbuję odpowiedzieć. Jeśli używasz "===", sprawdzasz także z typem zamiast wartością. Jeśli używasz "==", po prostu sprawdzasz, czy wartość jest taka sama, czy nie.

można odwołać się do here i here.

10

PHP jest porównanie tych ciągów jako liczb zmiennoprzecinkowych, a oni obaj są zerowe, więc MUST użyć operatora ===,

+2

Jak już powiedziałem w mojej odpowiedzi, to dlatego, że dwa ciągi są porównywane jako liczby zmiennoprzecinkowe, które są zaokrąglane do zera, więc są ** równe **, ale nie ** identyczne ** –

20

PHP używa IEEE 754 dla pływaków, i numery są tak małe, że Evalue 0.

Patrz: http://en.wikipedia.org/wiki/IEEE_floating_point

Name  Common name   Base Digits E min E max 
binary32 Single precision  2 23+1 −126 +127   
binary64 Double precision  2 52+1 −1022 +1023  
+2

Ale on nie porównywał pływaków, porównuje struny. Więc to, co PHP używa do float ** powinno ** być nieistotne – jalf

+2

@jalf php jest luźno wpisane i konwertuje wartości za kulisami == jest złe, jeśli nie znasz języka, jeśli chciał porównać je jako ciągi, których potrzebował używać === lub strcmp, o czym wspominali inni. – stoj

+7

@stoj tak, ale moim celem jest to, że ta odpowiedź nie odpowiada na pytanie: opisuje reprezentację fp używaną przez PHP, ale nie podaje ważnego faktu, że "jeśli twój ciąg wygląda jak wartość FP, zostanie przekonwertowany do wartości FP ". – jalf

13

myślę, że PHP odczytuje to jako składni naukowych, które będą tłumaczone jako:

608 x 10^-4234 == 272 x 10^-3063 

PHP interpretuje to jako 0 = 0.

Powiązane problemy