Neden karşılaştırma ve boş () PHP böyle davranıyor?

6 Cevap php

PHP:

$a = "0";
$b = "00";
var_dump(empty($a)); # True (wtf?)
var_dump($a == $b); # True... WTF???
var_dump(empty($b)); # False WWWTTTFFFF!!??

Ben dokümanlar okudum. Ama docs why they designed it this way gibi açıklama vermeyin. (Ben zaten onları biliyorum) geçici çözümler aramıyorum, ben bir açıklama arıyorum.

Neden bu gibi? Bu şekilde bazı şeyler daha kolay yapar mı?

6 Cevap

Her "doğru olanı yapma" dil tasarımcıları hedef kaynaklanıyor.

Bu kod verilen bir parça kod parçasının niave programcı ya da sıradan bir izleyici de bunu beklemek ne yapmalıyım. Bu başarmak için kolay bir hedef değildi.

Php has avoided most of worst pitfalls of other languages (like C's if (a = b) { ... or perl' s if ( "xxxx" == 0) { print "True!"; }). The 0 == 0000 and if ("000") { echo "True!"; } are two of the few cases where code might not do exactly what you expect, but in pracice it is seldom a problem. In my experience the "cure" using the exact comparison operator === is the one thing guarenteed to have novice php programmers scratching there heads and searching the manual.

"0" == "00" true için çözülmesi gelince, cevabı yatıyor Comparison Operators:

If you compare an integer with a string, the string is converted to a number. If you compare two numerical strings, they are compared as integers. These rules also apply to the switch statement.

(Vurgu eklenmiştir)

Her iki "0" ve "00" sayısal şeritler böylece sayısal bir karşılaştırma açıkça gerçekleştirilir ve vardır 0 == 0.

Eğer herhangi bir örtük tür dönüştürme istemiyorsanız bunun yerine === kullanarak öneririm.

Gelince empty() :

The following things are considered to be empty:

  • "" (Boş dize)
  • 0 (bir tamsayı olarak 0)
  • "0" (bir dizge olarak 0)
  • NULL
  • YANLIŞ
  • array () (boş bir dizi)
  • var $ var; (Değişken bildirilmiş, ancak bir sınıfta bir değeri olmayan)

http://au2.php.net/empty

The following things are considered to be empty: "0" (0 as a string)

ama "00" boş kabul edilmeyecektir.

Bu @ Gölge hayal gibi, bir dinamik yazarak mesele, PHP boş gördüğü ne ilgisi do vardır, ve. 0 ve 00 PHP'nin gözünde eşittir. Yerine katı eşitlik kullanmayı düşünün:

($ A === $ b) / / b için eşit ve aynı tür (dizeler)

Boş http://us.php.net/empty için belgeleri kontrol. Yani birinci ve üçüncü çizgiler dikkat etmelisiniz.

PHP dinamik yazdığınız çünkü saniye, bu kadar. tercüman onları kullandık hangi bağlamda kullanılmak için değişkenlerin türünü çıkarım edilir. Bu durumda tercüman muhtemelen numaralarını karşılaştırmak için çalışıyor ve karşılaştırarak önce ints için dize dönüştürme olduğunu düşünüyor.

From the documentation biri 0 int veya boş belirtmek için 1 karakter dizge olabilir varsayabiliriz. 00 diye bir şey yok bu yana 00 bir biçimlendirme varsayım daha fazla olurdu, ama 0 vardır. 00 2 tamsayı biçiminde ima olurdu, ama boş () fonksiyonu sadece 0 için yazılmıştır.

FWIW IANA php geliştirici.