Null vs. False vs. 0 dalam PHP

146

Saya diberitahu bahwa pengembang yang baik dapat mengenali / memanfaatkan perbedaan antara Nulldan Falsedan 0dan semua entitas "tidak ada" yang baik lainnya.
Apa adalah perbedaan, khususnya di PHP? Apakah ada hubungannya dengan ===?

stalepretzel
sumber
Hampir mustahil untuk benar-benar mencari tahu kapan apa yang digunakan. Saya kira penting bahwa Anda KONSISTEN saat Anda menggunakan nulldan kapan false. Saya lebih suka menggunakan nullketika mengambil nilai dari sebuah metode, karena saya dapat menggunakan issetuntuk menentukan apakah nilai yang dikembalikan daripada menggunakan emptyyang tidak akan mengambil di account: false, 0, '0'atau string kosong, yang dapat nilai-nilai yang layak dalam banyak situasi. Bagi saya itu solusi terbersih dalam konstruksi yang berantakan.
JMRC

Jawaban:

221

Ini spesifik bahasa, tetapi dalam PHP:

Nullberarti " tidak ada ". Var belum diinisialisasi.

Falseberarti " tidak benar dalam konteks boolean ". Digunakan untuk secara eksplisit menunjukkan bahwa Anda berurusan dengan masalah logis.

0adalah sebuah int. Tidak ada hubungannya dengan sisanya di atas, digunakan untuk matematika.

Sekarang, yang rumit, adalah bahwa dalam bahasa dinamis seperti PHP, semuanya memiliki nilai dalam konteks boolean , yang (dalam PHP) adalah False.

Jika Anda mengujinya ==, itu menguji nilai boolean, sehingga Anda akan mendapatkan kesetaraan. Jika Anda mengujinya ===, itu akan menguji jenisnya, dan Anda akan mendapatkan ketimpangan.

Jadi mengapa ini bermanfaat?

Nah, lihat strrpos()fungsinya. Mengembalikan False jika tidak menemukan apa pun, tetapi 0 jika telah menemukan sesuatu di awal string!

<?php
// pitfall :
if (strrpos("Hello World", "Hello")) { 
    // never exectuted
}

// smart move :
if (strrpos("Hello World", "Hello") !== False) {
    // that works !
}
?>

Dan tentu saja, jika Anda berurusan dengan negara:

Anda ingin membuat perbedaan antara DebugMode = False(disetel ke mati), DebugMode = True(setel ke hidup) dan DebugMode = Null(tidak disetel sama sekali, akan menyebabkan debugging keras ;-)).

e-satis
sumber
39
Catatan tentang Null: PHP menggunakannya sebagai "tidak ada nilai" tapi ini bukan kebiasaan yang baik untuk masuk. Secara umum, Null berarti "nilai tidak diketahui" yang berbeda dari "tidak ada nilai" atau "variabel tidak diinisialisasi". Tidak ada yang ditambah 1 adalah 1, sedangkan nilai yang tidak diketahui ditambah satu adalah nilai yang tidak diketahui. Ingatlah bahwa setiap operator yang menerapkan null akan (harus) menghasilkan null, karena operasi apa pun pada "nilai tidak dikenal" menghasilkan nilai yang tidak diketahui.
Eli
7
perlu diingat bahwa ini semua niat . tidak ada hubungannya dengan apa yang terjadi dalam kenyataan. pada kenyataannya suatu fungsi dapat mengembalikan false untuk nilai yang tidak ada (mis. strpos, input_filter) dan null untuk kegagalan (misalnya input_filter). jadi jawabannya adalah, gunakan === false dan / atau === null, setelah membaca dokumentasi fungsi tertentu.
gcb
5
@ Eli: dari mana Anda mendapatkan gagasan bahwa Null berarti "nilai tidak diketahui" secara umum. Saya tidak dapat memikirkan bahasa komputer di mana ini benar, juga tidak berarti bahwa dalam bahasa Inggris, setidaknya tidak sesuai dengan definisi yang dapat saya temukan atau dengar. Mungkin Anda tahu sesuatu yang saya tidak tahu?
iconoclast
2
@iconoclast - Saya mengambilnya dari dunia basis data. Seperti yang saya pahami, null digunakan sebagai pengganti untuk nilai data yang tidak ada dalam database atau tidak dikenal. Lihat dev.mysql.com/doc/refman/5.0/id/working-with-null.html atau en.wikipedia.org/wiki/Null_%28SQL%29 .
Eli
2
Eli tidak salah. Dia menyatakan itu secara semantik, ketika Anda menggunakan null, Anda memberi sinyal programmer lain bahwa Anda tidak tahu apa yang ada di sana. Itu tidak terdefinisi. Sementara ketika Anda menggunakan 0, Anda memberi sinyal bahwa Anda tahu apa yang ada di sana: angka. Dan di sini angka tersebut mewakili tidak adanya hal-hal. Ingat bahwa tidak peduli bagaimana nilai ancaman PHP, nilai membawa makna, nilai adalah bentuk dokumentasi.
e-satis
45

nulladalah null. falseadalah false. Sedih tapi benar.

tidak ada banyak konsistensi dalam PHP. pengembang MENCOBA untuk membuat null berarti "tidak dikenal" atau "tidak ada". tetapi seringkali False akan berfungsi sebagai 'tidak ada' (mis. strrpos ('gagal', 'pencarian') akan menghasilkan false, dan bukan null)

Anda akan sering melihat null digunakan ketika mereka sudah menggunakan false untuk sesuatu. mis. filter_input (). Mereka mengembalikan false jika variabel gagal filter. dan null jika variabel tidak ada (tidak ada artinya juga gagal filter? jadi mengapa bahkan mengembalikan null?!?)

php memiliki kemudahan mengembalikan data dalam fungsi. dan para pengembang menjejalkan semua jenis status kegagalan alih-alih data.

Dan Tidak ada cara yang waras dalam PHP untuk mendeteksi data (int, str, dll) dari kegagalan (false, null)

Anda cukup banyak harus selalu menguji === null atau === false, tergantung pada fungsinya. atau untuk keduanya, dalam kasus seperti filter_input () / filter_var ()

dan inilah beberapa kesenangan dengan tipe juggling. bahkan tidak termasuk array dan objek.

var_dump( 0<0 );        #bool(false)
var_dump( 1<0 );        #bool(false)
var_dump( -1<0 );       #bool(true)
var_dump( false<0 );    #bool(false)
var_dump( null<0 );     #bool(false)
var_dump( ''<0 );       #bool(false)
var_dump( 'a'<0 );      #bool(false)
echo "\n";
var_dump( !0 );        #bool(true)
var_dump( !1 );        #bool(false)
var_dump( !-1 );       #bool(false)
var_dump( !false );    #bool(true)
var_dump( !null );     #bool(true)
var_dump( !'' );       #bool(true)
var_dump( !'a' );      #bool(false)
echo "\n";
var_dump( false == 0 );        #bool(true)
var_dump( false == 1 );        #bool(false)
var_dump( false == -1 );       #bool(false)
var_dump( false == false );    #bool(true)
var_dump( false == null );     #bool(true)
var_dump( false == '' );       #bool(true)
var_dump( false == 'a' );      #bool(false)
echo "\n";
var_dump( null == 0 );        #bool(true)
var_dump( null == 1 );        #bool(false)
var_dump( null == -1 );       #bool(false)
var_dump( null == false );    #bool(true)
var_dump( null == null );     #bool(true)
var_dump( null == '' );       #bool(true)
var_dump( null == 'a' );      #bool(false)
echo "\n";
$a=0; var_dump( empty($a) );        #bool(true)
$a=1; var_dump( empty($a) );        #bool(false)
$a=-1; var_dump( empty($a) );       #bool(false)
$a=false; var_dump( empty($a) );    #bool(true)
$a=null; var_dump( empty($a) );     #bool(true)
$a=''; var_dump( empty($a) );       #bool(true)
$a='a'; var_dump( empty($a));      # bool(false)
echo "\n"; #new block suggested by @thehpi
var_dump( null < -1 ); #bool(true)
var_dump( null < 0 ); #bool(false)
var_dump( null < 1 ); #bool(true)
var_dump( -1 > true ); #bool(false)
var_dump( 0 > true ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( -1 > false ); #bool(true)
var_dump( 0 > false ); #bool(false)
var_dump( 1 > true ); #bool(true)
gcb
sumber
24
dalam opionion saya 0 == null adalah absolut nonsense, karena 0 adalah nilai dan nol adalah flag yang menunjukkan variabel tidak diinisialisasi. Terima kasih tim php
mercsen
1
Anda dua kali mengulangi bagian kode Anda mulai dengan var_dump( null == 0 );.
Sparky
2
apa yang benar-benar aneh di php: null <-1 => BENAR
thehpi
1
@mercsen Setidaknya jika PHP secara konsisten berperilaku seperti 0 == null saya akan setuju dengan itu. Anehnya, 0 == nulldan null == [], tapi [] != 0!!
nawfal
1
strrpos('fail', 'search') will return false, and not nullmenurut saya benar - jika nullberarti tidak diketahui maka strrposkembali nullakan seperti itu mengatakan 'Saya tidak tahu apakah string ada di sana' daripada 'String tidak ada di sana'.
Eborbob
22

Di bawah ini adalah contohnya:

            Comparisons of $x with PHP functions

Expression          gettype()   empty()     is_null()   isset() boolean : if($x)
$x = "";            string      TRUE        FALSE       TRUE    FALSE
$x = null;          NULL        TRUE        TRUE        FALSE   FALSE
var $x;             NULL        TRUE        TRUE        FALSE   FALSE
$x is undefined     NULL        TRUE        TRUE        FALSE   FALSE
$x = array();       array       TRUE        FALSE       TRUE    FALSE
$x = false;         boolean     TRUE        FALSE       TRUE    FALSE
$x = true;          boolean     FALSE       FALSE       TRUE    TRUE
$x = 1;             integer     FALSE       FALSE       TRUE    TRUE
$x = 42;            integer     FALSE       FALSE       TRUE    TRUE
$x = 0;             integer     TRUE        FALSE       TRUE    FALSE
$x = -1;            integer     FALSE       FALSE       TRUE    TRUE
$x = "1";           string      FALSE       FALSE       TRUE    TRUE
$x = "0";           string      TRUE        FALSE       TRUE    FALSE
$x = "-1";          string      FALSE       FALSE       TRUE    TRUE
$x = "php";         string      FALSE       FALSE       TRUE    TRUE
$x = "true";        string      FALSE       FALSE       TRUE    TRUE
$x = "false";       string      FALSE       FALSE       TRUE    TRUE

Silakan lihat ini untuk referensi lebih lanjut tentang perbandingan tipe dalam PHP. Seharusnya memberi Anda pemahaman yang jelas.

KristCont
sumber
5

Dalam PHP Anda dapat menggunakan operator === dan! == untuk memeriksa tidak hanya apakah nilainya sama tetapi juga jika tipenya cocok. Jadi misalnya: 0 == falseadalah true, tapi 0 === falseadalah false. Hal yang sama berlaku untuk !=versus !==. Juga jika Anda membandingkan nulldengan dua lainnya menggunakan operator yang disebutkan, mengharapkan hasil yang sama.

Sekarang di PHP kualitas nilai-nilai ini biasanya digunakan ketika mengembalikan nilai yang kadang-kadang bisa 0(nol), tetapi kadang-kadang mungkin fungsi gagal. Dalam kasus seperti itu di PHP Anda kembali falsedan Anda harus memeriksa kasus-kasus ini menggunakan operator identitas ===. Misalnya jika Anda mencari posisi satu string di dalam yang lain dan Anda menggunakan strpos(), fungsi ini akan mengembalikan posisi numerik yang dapat 0 jika string ditemukan di awal, tetapi jika string tidak ditemukan di semua, maka strpos()akan kembali falsedan Anda harus memperhitungkan ini ketika berhadapan dengan hasilnya.

Jika Anda akan menggunakan teknik yang sama dalam fungsi Anda, siapa pun yang akrab dengan pustaka PHP standar akan memahami apa yang sedang terjadi dan bagaimana memeriksa apakah nilai yang dikembalikan adalah apa yang diinginkan atau apakah terjadi kesalahan saat memproses. Hal yang sama berlaku untuk params fungsi, Anda dapat memprosesnya secara berbeda tergantung pada apakah mereka array atau string atau tidak, dan teknik ini juga digunakan di seluruh PHP, sehingga semua orang akan mendapatkannya dengan mudah. Jadi saya kira itulah kekuatannya.

inkredibl
sumber
5

False, Null, Nothing, 0, Undefined , dll., Dll.

Masing-masing memiliki makna spesifik yang berkorelasi dengan konsep aktual. Terkadang beberapa makna kelebihan beban menjadi satu kata kunci atau nilai tunggal.

Dalam C dan C ++ , NULL, Falsedan 0kelebihan beban dengan nilai yang sama. Dalam C # mereka 3 konsep yang berbeda.

nullatau NULLbiasanya menunjukkan kurangnya nilai, tetapi biasanya tidak menentukan alasannya. 0menunjukkan angka nol alami dan memiliki jenis-ekuivalensi dengan 1, 2, 3, dll. dan dalam bahasa yang mendukung konsep terpisah NULLharus diperlakukan hanya angka.

Salah menunjukkan tidak benar. Dan itu digunakan dalam nilai-nilai biner . Itu tidak berarti tidak disetel, juga tidak berarti 0. Ini hanya menunjukkan salah satu dari dua nilai biner.

Tidak ada yang dapat menunjukkan bahwa nilai secara khusus ditetapkan sebagai tidak ada yang menunjukkan hal yang sama dengan nol, tetapi dengan niat.

Tidak terdefinisi dalam beberapa bahasa menunjukkan bahwa nilai belum ditetapkan karena tidak ada kode yang menetapkan nilai aktual.

Orion Adrian
sumber
Menarik, mungkin, tetapi tidak membahas PHP sama sekali.
Brad
4

Saya baru saja menyia-nyiakan 1/2 hari mencoba untuk mendapatkan baik 0, null, falseuntuk kembali dari strops!

Inilah semua yang saya coba lakukan, sebelum saya menemukan bahwa logikanya tidak mengalir ke arah yang benar, sepertinya ada lubang hitam dalam pengkodean php:

Konsep mengambil nama domain yang dihosting di server, dan memastikan itu bukan level root, OK beberapa cara berbeda untuk melakukan ini, tetapi saya memilih yang berbeda karena fungsi / konstruksi php lain yang telah saya lakukan.

Pokoknya di sini adalah dasar dari cosing:

if (strpos($_SERVER ['SERVER_NAME'], dirBaseNAME ()) 
{ 
    do this 
} else {
    or that
}

{
echo strpos(mydomain.co.uk, mydomain);  

if ( strpos(mydomain, xmas) == null ) 
    {
        echo "\n1 is null"; 
    }

if ( (strpos(mydomain.co.uk, mydomain)) == 0 ) 
    {
        echo "\n2 is 0"; 
    } else {
        echo "\n2 Something is WRONG"; 
    }

if ( (mydomain.co.uk, mydomain)) != 0 ) 
    {
        echo "\n3 is 0"; 
    } else {
        echo "\n3 it is not 0"; 
    }

if ( (mydomain.co.uk, mydomain)) == null ) 
    {
        echo "\n4 is null"; 
    } else {
        echo "\n4 Something is WRONG"; 
    }
}

AKHIRNYA setelah membaca Topik ini, saya menemukan bahwa ini berhasil !!!

{
if ((mydomain.co.uk, mydomain)) !== false ) 
    {
        echo "\n5 is True"; 
    } else {
        echo "\n5 is False"; 
    }
}

Terima kasih untuk artikel ini, saya sekarang mengerti bahwa meskipun ini Natal, mungkin bukan Natal false, karena itu juga bisa menjadi NULLhari!

Setelah menghabiskan satu hari men-debug beberapa kode sederhana, berharap saya tahu ini sebelumnya, karena saya akan dapat mengidentifikasi masalah, daripada pergi ke semua tempat mencoba membuatnya bekerja. Itu tidak bekerja, karena False, NULLdan 0tidak semua sama dengan True or False or NULL?

madesignUK
sumber
2

Dari dokumentasi online PHP :

Untuk secara eksplisit mengkonversi nilai menjadi boolean, gunakan cetakan (bool) atau (boolean).
Namun, dalam banyak kasus para pemain tidak perlu, karena nilai akan secara otomatis dikonversi jika operator, fungsi atau struktur kontrol memerlukan argumen boolean.
Saat mengonversi ke boolean, nilai-nilai berikut ini dianggap SALAH:

  • boolean FALSEitu sendiri
  • integer `` 0 (nol)
  • float 0.0(nol)
  • string kosong, dan string "0"
  • sebuah array dengan elemen nol
  • objek dengan variabel anggota nol (hanya PHP 4)
  • tipe khusus NULL(termasuk variabel tidak disetel)
  • Objek SimpleXML dibuat dari tag kosong
    Setiap nilai lainnya dipertimbangkan TRUE(termasuk sumber daya apa pun).

Jadi, dalam banyak kasus, itu sama.

Di sisi lain, itu ===dan ==itu bukan hal yang sama. Secara teratur, Anda hanya perlu operator "sama". Untuk memperjelas:

$a == $b    //Equal. TRUE if $a is equal to $b.
$a === $b   //Identical. TRUE if $a is equal to $b, and they are of the same type. 

Untuk informasi lebih lanjut, lihat halaman " Operator Perbandingan " di dokumen PHP online.

Semoga ini membantu.

Javier Constanzo
sumber
1

Perbedaan antara nilai-nilai ini selalu mengarah pada aturan spesifik bahasa yang terperinci. Apa yang Anda pelajari untuk PHP belum tentu benar untuk Python, atau Perl, atau C, dll. Meskipun mempelajari aturan-aturan untuk bahasa yang sedang Anda tangani, sangat bergantung pada terlalu banyak hal itu adalah masalah. . Masalahnya muncul ketika programmer berikutnya perlu mempertahankan kode Anda dan Anda telah menggunakan beberapa konstruk yang mengambil keuntungan dari beberapa detail kecil Null vs. False (misalnya). Kode Anda harus terlihat benar (dan sebaliknya, kode yang salah akan terlihat salah ).

Greg Hewgill
sumber
1

Null digunakan dalam database untuk mewakili "tidak ada catatan" atau "tidak ada informasi". Jadi, Anda mungkin memiliki bidang isian kecil yang menjelaskan "apakah pengguna ini ingin dikirimi email oleh kami", di mana True berarti demikian, Salah berarti mereka tidak ingin dikirim apa pun, tetapi Null berarti Anda tidak mau saya tidak tahu. Mereka dapat muncul melalui gabungan luar dan sejenisnya.

Implikasi logis dari Null seringkali berbeda - dalam beberapa bahasa NULL tidak sama dengan apa pun, jadi jika (a == NULL) akan selalu salah.

Jadi secara pribadi saya akan selalu menginisialisasi boolean ke FALSE, dan menginisialisasi satu ke NULL akan terlihat agak menjengkelkan (bahkan di C di mana keduanya hanya 0 ... hanya gaya saja).

Peter
sumber
1

Saya pikir pengembang yang buruk menemukan semua kegunaan yang berbeda dari null / 0 / false dalam kode di sana.

Misalnya, salah satu kesalahan paling umum yang dilakukan pengembang adalah mengembalikan kode kesalahan dalam bentuk data dengan fungsi.

// On error GetChar returns -1
int GetChar()

Ini adalah contoh antarmuka gula. Ini dijelaskan dalam buku "Debug proses pengembangan perangkat lunak" dan juga di buku lain "menulis kode yang benar".

Masalah dengan ini, adalah implikasi atau asumsi yang dibuat pada tipe char. Pada beberapa kompiler, tipe char dapat tidak ditandatangani. Jadi meskipun Anda mengembalikan -1 kompiler dapat mengembalikan 1 sebagai gantinya. Asumsi-asumsi kompiler semacam ini dalam C ++ atau C sulit dikenali.

Sebaliknya, cara terbaik adalah tidak mencampur kode kesalahan dengan data Anda. Jadi fungsinya sebagai berikut.

char GetChar()

sekarang menjadi

// On success return 1
// on failure return 0
bool GetChar(int &char)

Ini berarti tidak peduli seberapa muda pengembang di toko pengembangan Anda, ia tidak akan pernah salah. Meskipun ini tidak berbicara tentang redudansi atau ketergantungan dalam kode.

Jadi secara umum, menukar bool sebagai tipe kelas pertama dalam bahasa itu oke dan saya pikir joel membicarakannya dengan postcast terbarunya. Tetapi cobalah untuk tidak menggunakan mix and match bools dengan data Anda dalam rutinitas Anda dan Anda akan baik-baik saja.

Chad
sumber
1

Dalam PHP tergantung pada apakah Anda memvalidasi jenis:

( 
 ( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
 ( false !== null ) && ( false == null ) 
)

Secara teknis null adalah 0x00tetapi dalam PHP ( null == 0x00 ) && ( null !== 0x00 ).

0 adalah nilai integer.

Gavin M. Roy
sumber
1

Satu fakta menarik tentang NULLPHP: Jika Anda menetapkan var sama dengan NULL, itu sama seperti jika Anda telah memanggilnya unset().

NULLpada dasarnya berarti suatu variabel tidak memiliki nilai yang diberikan padanya; falseadalah nilai Boolean yang valid, 0adalah nilai integer yang valid, dan PHP memiliki beberapa konversi cukup jelek antara 0, "0", "", dan false.

dirtside
sumber
0

Null bukan apa-apa, Salah sedikit, dan 0 adalah (mungkin) 32 bit.

Bukan pakar PHP, tetapi dalam beberapa bahasa yang lebih modern, itu tidak dapat dipertukarkan. Aku agak rindu memiliki 0 dan false dapat dipertukarkan, tetapi dengan boolean menjadi tipe aktual Anda dapat memiliki metode dan objek yang terkait dengannya sehingga itu hanya pertukaran. Null adalah nol, tidak adanya apapun pada dasarnya.

CodeRedick
sumber
0

Yah, saya tidak dapat mengingat cukup dari hari-hari PHP saya untuk menjawab bagian "===", tetapi untuk sebagian besar bahasa gaya-C, NULL harus digunakan dalam konteks nilai pointer, false sebagai boolean, dan nol sebagai nilai numerik seperti int. '\ 0' adalah nilai adat untuk konteks karakter. Saya biasanya juga lebih suka menggunakan 0,0 untuk mengapung dan ganda.

Jadi .. jawaban cepatnya adalah: konteks.

jasonmray
sumber
0

Dalam hampir semua bahasa modern, null secara logis merujuk ke pointer (atau referensi) yang tidak memiliki nilai, atau variabel yang tidak diinisialisasi. 0 adalah nilai integer dari nol, dan false adalah nilai boolean dari, well, false. Untuk membuat hal-hal rumit, dalam C, misalnya, null, 0, dan false semuanya direpresentasikan dengan cara yang sama persis. Saya tidak tahu cara kerjanya di PHP.

Kemudian, untuk lebih menyulitkan, database memiliki konsep nol, yang berarti hilang atau tidak berlaku, dan sebagian besar bahasa tidak memiliki cara langsung untuk memetakan DBNull ke nol mereka. Sampai saat ini, misalnya, tidak ada perbedaan antara int menjadi nol dan menjadi nol, tetapi itu diubah dengan nulls int.

Maaf membuat ini terdengar rumit. Hanya saja ini telah menjadi titik lengket harry dalam bahasa selama bertahun-tahun, dan sampai saat ini, belum ada resolusi yang jelas di mana pun. Orang-orang biasa mengumpulkan hal-hal bersama-sama atau membuat kosong atau 0 mewakili nol dalam database, yang tidak selalu berfungsi dengan baik.

Charles Graham
sumber
0

Salah dan 0 secara konseptual serupa, yaitu isomorfik. 0 adalah nilai awal untuk aljabar bilangan asli, dan Salah adalah nilai awal untuk aljabar Boolean.

Dengan kata lain, 0 dapat didefinisikan sebagai angka yang, ketika ditambahkan ke beberapa bilangan asli, menghasilkan angka yang sama:

x + 0 = x

Demikian pula, False adalah nilai sedemikian sehingga disjungsi dan nilai lainnya adalah nilai yang sama:

x || False = x

Null secara konseptual adalah sesuatu yang sangat berbeda. Bergantung pada bahasanya, ada semantik yang berbeda untuk itu, tetapi tidak ada yang menggambarkan "nilai awal" sebagai False dan 0. Tidak ada aljabar untuk Null. Ini berkaitan dengan variabel, biasanya untuk menyatakan bahwa variabel tidak memiliki nilai spesifik dalam konteks saat ini. Dalam sebagian besar bahasa, tidak ada operasi yang ditentukan pada Null, dan itu adalah kesalahan untuk menggunakan Null sebagai operan. Dalam beberapa bahasa, ada nilai khusus yang disebut "bawah" daripada "nol", yang merupakan pengganti untuk nilai perhitungan yang tidak berakhir.

Saya telah menulis lebih luas tentang implikasi NULL di tempat lain.

Apocalisp
sumber
1
offtopic, false == 0 benar-benar terbelakang. Terlebih lagi dengan php mengembalikan data ATAU kegagalan dalam suatu fungsi. lihat pengembalian untuk mysql_insert_id. "" "ID yang dihasilkan untuk kolom AUTO_INCREMENT oleh kueri sebelumnya tentang kesuksesan, 0 jika kueri sebelumnya tidak menghasilkan nilai AUTO_INCREMENT, atau SALAH jika tidak ada koneksi MySQL yang dibuat." "" Pada dasarnya ia dapat mengembalikan A) id, B) nol, C) salah ... sekarang jika itu adalah item pertama dalam tabel, id akan menjadi nol! jadi ketiga nilai itu sama! bagaimana pengembang dapat memahami tiga jenis nol? ... dan saya setuju dengan posting Anda pada nol.
gcb
0

Seseorang dapat menjelaskan kepada saya mengapa 'NULL' bukan hanya string dalam contoh perbandingan?

$x = 0;
var_dump($x == 'NULL');  # TRUE   !!!WTF!!!
vladzur
sumber
1
Karena PHP secara internal melakukan cast ke tipe integer dan membandingkannya. php > var_dump((int) "NULL"); // => int(0) php > var_dump((int) "BLA"); // => int(0)lihat php.net/manual/en/language.operators.comparison.php Terjemahkan string dan sumber daya ke angka, matematika biasa
Sevyls
-1

Masalah dengan kepalsuan berasal dari sejarah PHP. Masalahnya menargetkan jenis skalar yang tidak didefinisikan dengan baik.

'*' == true -> true (string match)
'*' === true -> false (numberic match)

(int)'*' == true -> false
(string)'*' == true -> true

Ketat PHP7 adalah langkah maju, tapi mungkin tidak cukup. https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/

adrian
sumber