php null veya boş mu?


208

NULLPHP ile ilgili bir sorum var :

  $a = '';
  if($a == NULL) {
      echo 'is null';
  }

Boş bir dize olduğunda neden null olduğunu görüyorum $a? Bu bir hata mı?

Yanıtlar:


348

Aradığın şey:

if($variable === NULL) {...}

Not edin ===.
Kullandığınız ==gibi, PHP, NULL , false , 0 , boş dizeyi ve boş dizileri eşit kabul eder.


13
Yanlış, durumunuz yalnızca başlatılmamış ve boş değerlerle eşleşiyor $variable. Ne istiyorsun aslında: $variable == null(not ==)
Thomas LAURENT

6
@ThomasLAURENT, OP'nin aradığı == nullşey buydu , neden sadece boş veya tanımsız değil boş dizeyle eşleştiğini merak ediyorlardı .
Godwin

3
Hata benim hatalar, ama son cümle beni NULL, false, 0 ve "" kesinlikle eşit olduğunu yanlış yönlendirdi, yanlış anlama için özür dilerim.
Thomas LAURENT

3
@James PHP'de amaçlanan bir davranış, 2017'de bile hala geçerli ve sanırım uzun bir süre boyunca doğru olacak
Defrag 3

1
$a = ''boş string, falseboolean, $a = 0;tamsayı ve nulltürden null. OP'nin söylediği, PHP'nin bunları "aynı" değerde, ancak "aynı" türünde işlemeyeceğidir. Bu nedenle, sıkı bir === kontrol türü kontrol eder ve farklı olanları kullanırsanız başarısız olur. Dönüş değerlerinizde tutarlılık olmanızın nedeni budur. Bir dizeyi normalde gibi bir yöntemde döndürürseniz getName(), nullboş olduğunda almamalısınız , ancak büyük olasılıkla bir emtpy dizesi $user->getName() === '' veya $user->getId() === 0veya $user->isActive === false. Amaçlanan davranış!
Çağatay Ulubay

225

Aşağıdaki tabloda gösterildiği gibi, empty($foo)ile eşdeğerdir $foo==nullve is_null($foo)aynı işleve sahiptir $foo===null. Tablo ayrıca nullkarşılaştırmayla ilgili bazı zor değerleri göstermektedir . (ϕ başlatılmamış değişkenleri gösterir.)

         empty    is_null 
         ==null  ===null  isset   array_key_exists
      ϕ |   T   |   T   |   F   |   F   
   null |   T   |   T   |   F   |   T   
     "" |   T   |   F   |   T   |   T   
     [] |   T   |   F   |   T   |   T
      0 |   T   |   F   |   T   |   T      
  false |   T   |   F   |   T   |   T   
   true |   F   |   F   |   T   |   T   
      1 |   F   |   F   |   T   |   T   
     \0 |   F   |   F   |   T   |   T   

Asla kullanmam empty()ve is_null()işlevler. Basit karşılaştırmayı kullanmak daha az belirsiz, daha hızlı ve daha temizdir. Özellikle daha az kıvrımlı parantez olacaktır.

örneğin if($x==null || $y==null)vsif(is_null($x) || is_null($y))


2
Tabloda "0" ve "0.0" eksik. İşleri gerçekten zorlaştırıyor, özellikle boş (). Bu yüzden boş () kullanmaktan kaçınırım.
datasn.io

1
@PHPst Gösterdiğiniz tabloya göre, aslında 'basit karşılaştırma' olarak adlandırdığınız şeyin php kodu nedir?
Chetabahana

@hyip ==nullve ===null.
PHPst

Bu en iyi cevap, çok daha eksiksiz olmalı. Teşekkürler.
pgr

@PHPst Basit karşılaştırmanın daha az belirsiz olduğunu söylediniz. Bu boş NULL () vb yerine basit karşılaştırma kullanarak bir örnek verebilir misiniz
Naeem Ul Wahhab

28

kontrol ==vs===

'' == NULLtrue
0 == NULLdönecekti true
false == nulldönecekti true dönecekti

buna karşılık

'' === NULLyanlış
0 === NULLdöndürür yanlış
false === NULLdöndürür yanlış döndürür


Test edilmiş ve doğru. '' == null (true) while '' === null (false)
TheLegendaryCopyCoder

18

Hayır, bu bir hata değil. Görebilirsiniz == ile gevşek karşılaştırmalar tablo diğer sütunlarda değerleri ile birinci sütunda her değer karşılaştırma sonucunu gösterir (ikinci tablo):

    TRUE    FALSE   1       0       -1      "1"     "0"     "-1"    NULL    array() "php"   ""

    [...]    

""  FALSE   TRUE    FALSE   TRUE    FALSE   FALSE   FALSE   FALSE   TRUE    FALSE   FALSE   TRUE

Eğer boş bir dize o var görebilirsiniz ""ile karşılaştırıldığında false, 0, NULLveya ""gerçek verecektir.

Bunun yerine is_null [dokümanlar] veya katı bir karşılaştırma (üçüncü tablo) kullanmak isteyebilirsiniz .


Gevşek karşılaştırmalar tablosu, 0 == "php" veya "php" == 0 değerlerinin karşılaştırılmasının her ikisinin de doğru olacağını gösterir. Ne oluyor orada?
Robert

1
@Robert: Rakamlarla başlamayan 0bir dize, bir dizeye yayınlandığında dönüştürülür : codepad.org/qi40SG3E . Yani (int)"php" == 0.
Felix Kling

@Robert: Demek "zaman için döküm numarası " .
Felix Kling

12

Bu değil bir hata ama PHP normal bir davranış. Çünkü olur ==PHP'de operatör türü için denetlemez.

'' == null == 0 == false

Değerlerin aynı türe sahip olup olmadığını da kontrol etmek istiyorsanız, ===bunun yerine kullanın. Bu farkı derinlemesine incelemek için lütfen resmi belgeleri okuyun .


8

Eğer kullanırsanız ==, php boş bir dizeyi veya diziyi olarak ele alır null. Arasında ayrım yapmak için nullve empty, her iki kullanım ===ya da is_null. Yani:

if($a === NULL) veya if(is_null($a))


if ($ a === NULL)
Caster


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.