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 ===
?
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 ===
?
Jawaban:
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 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.
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 ;-)).
null
adalah null
. false
adalah 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)
var_dump( null == 0 );
.
0 == null
dan null == []
, tapi [] != 0
!!
strrpos('fail', 'search') will return false, and not null
menurut saya benar - jika null
berarti tidak diketahui maka strrpos
kembali null
akan seperti itu mengatakan 'Saya tidak tahu apakah string ada di sana' daripada 'String tidak ada di sana'.
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.
Dalam PHP Anda dapat menggunakan operator === dan! == untuk memeriksa tidak hanya apakah nilainya sama tetapi juga jika tipenya cocok. Jadi misalnya: 0 == false
adalah true
, tapi 0 === false
adalah false
. Hal yang sama berlaku untuk !=
versus !==
. Juga jika Anda membandingkan null
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 kembali false
dan 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 false
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.
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
dan 0
kelebihan beban dengan nilai yang sama. Dalam C # mereka 3 konsep yang berbeda.
null
atau NULL
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 terpisah NULL
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.
Saya baru saja menyia-nyiakan 1/2 hari mencoba untuk mendapatkan baik 0
, null
, false
untuk 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 NULL
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
dan 0
tidak semua sama dengan True or False or NULL
?
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:
FALSE
itu sendiri 0.0
(nol) "0"
NULL
(termasuk variabel tidak disetel) 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.
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 ).
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).
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.
Dalam PHP tergantung pada apakah Anda memvalidasi jenis:
(
( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
( false !== null ) && ( false == null )
)
Secara teknis null adalah 0x00
tetapi dalam PHP ( null == 0x00 ) && ( null !== 0x00 )
.
0
adalah nilai integer.
Satu fakta menarik tentang NULL
PHP: Jika Anda menetapkan var sama dengan NULL
, itu sama seperti jika Anda telah memanggilnya unset()
.
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 antara 0
, "0"
, ""
, dan false
.
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.
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.
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.
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.
Seseorang dapat menjelaskan kepada saya mengapa 'NULL' bukan hanya string dalam contoh perbandingan?
$x = 0;
var_dump($x == 'NULL'); # TRUE !!!WTF!!!
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
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/
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.