Tamsayı'ya dize karşılaştırarak garip sonuçlar verir

3 Cevap php

Ben gerçekten bu işlem çalışır neden olarak kafam karıştı. Birisi açıklayabilir misiniz?

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
$test2 = "3581169b064f71be1630b321d3ca318f";

if ($test1 == 0)
  echo "Test 1 is Equal!?";
if ($test2 == 0)
  echo "Test 2 is Equal!?";

// Returns: Test 1 is Equal!?

Açıklık getirmek için, ben dize "0" $test değişkenleri karşılaştırmak çalışıyorum. Ben zaten (ben olması gerektiği gibi) Ben sadece koyabilirsiniz.Eğer kodunu düzeltmek için biliyorum 0 "" s

Bu bir PHP hata, bir sunucu hata, ya da bir şekilde geçerli bir işlem olup olmadığını merak ediyorum. Göre http://us3.php.net/types.comparisons bu should not çalıştım.

Edit: görünüşe dize ile 0 arasındaki gevşek karşılaştırmalar doğru olduğunu söz etmez, o Scratch. Ama hala neden bilmiyorum.

Edit 2: Benim soru, neden $test2 değeri "3581169b064f71be1630b321d3ca318f" çalışmıyor revize ettik?

3 Cevap

From the PHP manual:

String conversion to numbers

When a string is evaluated in a numeric context, the resulting value and type are determined as follows.

The string will be evaluated as a float if it contains any of the characters '.', 'e', or 'E'. Otherwise, it will be evaluated as an integer.

The value is given by the initial portion of the string. If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero). Valid numeric data is an optional sign, followed by one or more digits (optionally containing a decimal point), followed by an optional exponent. The exponent is an 'e' or 'E' followed by one or more digits.

Type conversion using the == operator

== Operatörü gevşek daktilo karşılaştırma. Bu ortak bir türe hem de dönüştürmek ve bunları karşılaştırmak olacaktır. Dizeleri sayılara dönüştürülür yolu explained here.

page you linked to bu çelişmez unutmayın. O 0 "php" kullanarak bir dize tamsayı karşılaştırarak == doğru olacaktır diyor ikinci tablo, kontrol edin.

Ne olur dize tamsayı dönüştürülür ve sayısal olmayan dizeler (içerebilir veya bir sayı ile başlamayan dizeleri) 0 dönüştürmek olmasıdır.

Numeric vs non-numeric strings

Bir dizi oluşur, ya da bir sayı ile başlayan bir dize, bir numeric string olarak kabul edilir. Dize bu sayıdan sonra diğer karakterler varsa, bu göz ardı edilir.

Bir dize numaranın bir parçası olarak yorumlanabilir edilemez bir karakteri ile başlıyorsa, o zaman non-numeric string ve 0 dönüşecektir. Eksi işareti bu durumda bir dizi parçası olduğu için örneğin "-1" sayısal bir dize - Bu bir sayısal dizge bir rakam (0-9) ile başlamak zorunda olduğu anlamına gelmez.

Yani, örneğin, sizin dize "d85d1d81b25614a3504a3d5601a9cb2e" bir sayı ile başlamaz, bu nedenle 0 dönüştürmek istiyorsunuz. Ama ikinci bir dize "3581169b064f71be1630b321d3ca318f" 3581169 tamsayı dönüştürülmüş olacaktır. Ikinci deneme aynı şekilde çalışmıyor Demek bu yüzden.

What you should do

Muhtemelen istiyorum:

if ($test1 === "0")

Üçlü eşittir yerine bir çift eşittir kullanımına dikkat edin. Bu ne karşılaştırarak sadece rakam sıfır içeren bir dize olmasını sağlar ve herhangi bir tip dönüşümü engellemektedir.

Biraz araştırma yaptıktan sonra, bir tamsayı olarak döküm zaman any strings that do not start with a number 0'a dönüştürülür olacağını belirtti PHP manuel Aidan çıkıyor.

Bu durum şu anlama gelir:

("php" == 0) === true
("1php" == 0) === false

Çok sinir bozucu ve iyi belgelenmiş değil. Bu tip karşılaştırma sayfasında yorumların altında oldu.