php kosong atau kosong?

208

Saya punya pertanyaan tentang NULLPHP:

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

Mengapa saya melihat null ketika $astring kosong? Apakah itu bug?

Erin Tucker
sumber

Jawaban:

348

Apa yang Anda cari adalah:

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

Perhatikan ===.
Saat digunakan ==, seperti yang Anda lakukan, PHP memperlakukan NULL , false , 0 , string kosong , dan array kosong sama.

Godwin
sumber
13
Salah, kondisi Anda hanya cocok dengan yang tidak diinisialisasi dan null $variable. Yang Anda inginkan sebenarnya: $variable == null(perhatikan ==)
Thomas LAURENT
6
@ThomasLAURENT, itulah yang dicari OP, mereka bertanya-tanya mengapa == nullcocok dengan string kosong dan bukan hanya nol atau tidak terdefinisi.
Godwin
3
Oups kesalahan saya, tapi kalimat terakhir Anda membuat saya berpikir NULL, false, 0 dan "" yang ketat sama yang salah, maaf untuk kesalahpahaman.
Thomas LAURENT
3
@ James itu adalah perilaku yang dimaksudkan dalam PHP, itu masih berlaku bahkan pada tahun 2017 dan akan berlaku untuk waktu yang lama kurasa
Defrag
1
$a = ''adalah kosong string, falseadalah boolean, $a = 0;adalah bilangan bulat dan nulldari tipe null. Apa yang dikatakan OP adalah bahwa PHP akan mengaitkannya dengan nilai "sama", tetapi bukan tipe "sama". Jadi pemeriksaan ketat === juga akan memeriksa jenis dan gagal jika Anda menggunakan yang berbeda. Itulah alasan Anda harus konsisten dalam nilai pengembalian Anda. Jika Anda biasanya mengembalikan string dalam metode seperti getName(), Anda tidak boleh mendapatkannya nullsaat kosong, tetapi lebih cenderung string emtpy $user->getName() === ''atau $user->getId() === 0atau $user->isActive === false. Perilaku yang disengaja!
Cagatay Ulubay
225

Seperti yang ditunjukkan pada tabel berikut, empty($foo)sama dengan $foo==nulldan is_null($foo)memiliki fungsi yang sama $foo===null. Tabel juga menunjukkan beberapa nilai rumit mengenai nullperbandingan. (ϕ menunjukkan variabel yang tidak diinisialisasi.)

         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   

Saya tidak pernah menggunakan empty()dan is_null()fungsinya. Menggunakan perbandingan sederhana kurang ambigu, lebih cepat dan lebih bersih. Terutama akan ada kurung keriting yang kurang cocok.

misalnya if($x==null || $y==null)vsif(is_null($x) || is_null($y))

PHPst
sumber
2
Tidak ada "0" dan "0,0" di tabel. Mereka membuat hal-hal yang sangat rumit, terutama kosong (). Itu sebabnya saya menghindari menggunakan kosong ().
datan.io
1
@PHPst Basis pada tabel yang Anda tunjukkan, jadi apa sebenarnya kode php dari apa yang Anda sebut 'perbandingan sederhana'?
Chetabahana
@hyip ==nulldan ===null.
PHP
Ini harus menjadi jawaban teratas, jauh lebih lengkap. Terima kasih.
hal
@PHPst Anda mengatakan bahwa perbandingan sederhana kurang ambigu. Bisakah Anda memberikan contoh menggunakan perbandingan sederhana alih-alih NULL ini kosong () dll.
Naeem Ul Wahhab
28

periksa ==vs===

'' == NULLakan kembali benar
0 == NULLakan kembali benar
false == nullakan kembali benar

dimana sebagai

'' === NULLakan kembali salah
0 === NULLakan kembali salah
false === NULLakan kembali salah

Jancha
sumber
Diuji dan benar. '' == null (true) while '' === null (false)
TheLegendaryCopyCoder
18

Tidak, itu bukan bug. Lihatlah perbandingan Loose dengan tabel == ( tabel kedua), yang menunjukkan hasil membandingkan setiap nilai di kolom pertama dengan nilai-nilai di kolom lain:

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

    [...]    

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

Di sana Anda dapat melihat bahwa string kosong ""dibandingkan dengan false, 0, NULLatau ""akan menghasilkan benar.

Anda mungkin ingin menggunakan is_null [dokumen] sebagai gantinya, atau perbandingan ketat (tabel ketiga).

Felix Kling
sumber
Tabel perbandingan longgar tampaknya menyarankan bahwa membandingkan 0 == "php" atau "php" == 0 keduanya akan menghasilkan true. apa yang terjadi disana?
Robert
1
@ Robert: String yang tidak dimulai dengan digit dikonversi menjadi 0ketika dilemparkan ke string: codepad.org/qi40SG3E . Jadi (int)"php" == 0.
Felix Kling
@ Robert: Maksud saya "ketika dilemparkan ke nomor " .
Felix Kling
12

Ini bukan bug tetapi perilaku normal PHP. Itu terjadi karena ==operator di PHP tidak memeriksa jenis.

'' == null == 0 == false

Jika Anda ingin juga memeriksa apakah nilainya memiliki tipe yang sama, gunakan ===saja. Untuk mempelajari perbedaan ini secara mendalam, silakan baca dokumentasi resmi .

Aurelio De Rosa
sumber
8

Jika Anda menggunakan ==, php memperlakukan string atau array kosong sebagai null. Untuk membuat perbedaan antara nulldan empty, gunakan ===atau is_null. Begitu:

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

dayuloli
sumber
if ($ a === NULL)
Caster
6

PHP 7 isset () vs kosong () vs is_null ()

masukkan deskripsi gambar di sini

Foued MOUSSI
sumber