Saya diberitahu bahwa pengembang yang baik dapat mengenali / memanfaatkan perbedaan antara Null
dan False
dan 0
dan semua entitas "tidak ada" yang baik lainnya.
Apa adalah perbedaan, khususnya di PHP? Apakah ada hubungannya dengan ===
?
146
null
dan kapanfalse
. Saya lebih suka menggunakannull
ketika mengambil nilai dari sebuah metode, karena saya dapat menggunakanisset
untuk menentukan apakah nilai yang dikembalikan daripada menggunakanempty
yang 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.Jawaban:
Ini spesifik bahasa, tetapi dalam PHP:
Null
berarti " tidak ada ". Var belum diinisialisasi.False
berarti " tidak benar dalam konteks boolean ". Digunakan untuk secara eksplisit menunjukkan bahwa Anda berurusan dengan masalah logis.0
adalah sebuahint
. 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!Dan tentu saja, jika Anda berurusan dengan negara:
Anda ingin membuat perbedaan antara
DebugMode = False
(disetel ke mati),DebugMode = True
(setel ke hidup) danDebugMode = Null
(tidak disetel sama sekali, akan menyebabkan debugging keras ;-)).sumber
null
adalahnull
.false
adalahfalse
. 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.
sumber
var_dump( null == 0 );
.0 == null
dannull == []
, tapi[] != 0
!!strrpos('fail', 'search') will return false, and not null
menurut saya benar - jikanull
berarti tidak diketahui makastrrpos
kembalinull
akan seperti itu mengatakan 'Saya tidak tahu apakah string ada di sana' daripada 'String tidak ada di sana'.Di bawah ini adalah contohnya:
Silakan lihat ini untuk referensi lebih lanjut tentang perbandingan tipe dalam PHP. Seharusnya memberi Anda pemahaman yang jelas.
sumber
Dalam PHP Anda dapat menggunakan operator === dan! == untuk memeriksa tidak hanya apakah nilainya sama tetapi juga jika tipenya cocok. Jadi misalnya:
0 == false
adalahtrue
, tapi0 === false
adalahfalse
. Hal yang sama berlaku untuk!=
versus!==
. Juga jika Anda membandingkannull
dengan 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 kembalifalse
dan Anda harus memeriksa kasus-kasus ini menggunakan operator identitas===
. Misalnya jika Anda mencari posisi satu string di dalam yang lain dan Anda menggunakanstrpos()
, fungsi ini akan mengembalikan posisi numerik yang dapat 0 jika string ditemukan di awal, tetapi jika string tidak ditemukan di semua, makastrpos()
akan kembalifalse
dan 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.
sumber
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
,False
dan0
kelebihan beban dengan nilai yang sama. Dalam C # mereka 3 konsep yang berbeda.null
atauNULL
biasanya menunjukkan kurangnya nilai, tetapi biasanya tidak menentukan alasannya.0
menunjukkan angka nol alami dan memiliki jenis-ekuivalensi dengan 1, 2, 3, dll. dan dalam bahasa yang mendukung konsep terpisahNULL
harus 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.
sumber
Saya baru saja menyia-nyiakan 1/2 hari mencoba untuk mendapatkan baik
0
,null
,false
untuk kembali daristrops
!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:
AKHIRNYA setelah membaca Topik ini, saya menemukan bahwa ini berhasil !!!
Terima kasih untuk artikel ini, saya sekarang mengerti bahwa meskipun ini Natal, mungkin bukan Natal
false
, karena itu juga bisa menjadiNULL
hari!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
,NULL
dan0
tidak semua sama denganTrue or False or NULL
?sumber
Dari dokumentasi online PHP :
FALSE
itu sendiri0.0
(nol)"0"
NULL
(termasuk variabel tidak disetel)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:Untuk informasi lebih lanjut, lihat halaman " Operator Perbandingan " di dokumen PHP online.
Semoga ini membantu.
sumber
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 ).
sumber
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).
sumber
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.
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.
sekarang menjadi
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.
sumber
Dalam PHP tergantung pada apakah Anda memvalidasi jenis:
Secara teknis null adalah
0x00
tetapi dalam PHP( null == 0x00 ) && ( null !== 0x00 )
.0
adalah nilai integer.sumber
Satu fakta menarik tentang
NULL
PHP: Jika Anda menetapkan var sama denganNULL
, itu sama seperti jika Anda telah memanggilnyaunset()
.NULL
pada dasarnya berarti suatu variabel tidak memiliki nilai yang diberikan padanya;false
adalah nilai Boolean yang valid,0
adalah nilai integer yang valid, dan PHP memiliki beberapa konversi cukup jelek antara0
,"0"
,""
, danfalse
.sumber
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.
sumber
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.
sumber
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.
sumber
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:
Demikian pula, False adalah nilai sedemikian sehingga disjungsi dan nilai lainnya adalah nilai yang sama:
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.
sumber
Seseorang dapat menjelaskan kepada saya mengapa 'NULL' bukan hanya string dalam contoh perbandingan?
sumber
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 biasaMasalah dengan kepalsuan berasal dari sejarah PHP. Masalahnya menargetkan jenis skalar yang tidak didefinisikan dengan baik.
Ketat PHP7 adalah langkah maju, tapi mungkin tidak cukup. https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/
sumber