Operator gandakan bukan (!!) di PHP

188

Apa yang tidak dilakukan oleh operator ganda dalam PHP?

Sebagai contoh:

return !! $row;

Apa yang akan dilakukan oleh kode di atas?

Andrei
sumber
32
Ini pada dasarnya sama dengan melakukanreturn (bool) $row;
WildlyInaccurate
5
Saya bertanya-tanya siapa di antara mereka yang lebih cepat dan kami memiliki (bool) sebagai pemenang. i.stack.imgur.com/dcnsM.png
Binod Kalathil
1
@Binod itu info yang bagus, terima kasih untuk itu!
Robin K

Jawaban:

291

Ini bukan "bukan operator ganda", itu bukan operator yang diterapkan dua kali. Hak !akan menghasilkan boolean, terlepas dari operan . Maka kiri !akan meniadakan boolean itu.

Ini berarti bahwa untuk setiap nilai sebenarnya (angka selain nol, string dan array yang tidak kosong, dll.) Anda akan mendapatkan nilai boolean TRUE, dan untuk nilai salah apa pun (0, 0,0, NULLstring kosong atau array kosong) Anda akan mendapatkan nilai boolean FALSE.

Secara fungsional ini setara dengan gips untuk boolean:

return (bool)$row;
Theo
sumber
22
"double-not-operator" atau "double not-operator" .. tergantung bagaimana Anda membacanya.
nickf
9
@nickf tidak juga, "operator ganda bukan" mengacu pada satu operator, bukan tindakan menggunakan operator tidak dua kali.
Theo
3
@Theo, Ini sebenarnya satu operator? Apakah penerjemah menganggap !!sama (bool)dalam hal ini? Atau apakah kode mesin yang berbeda dijalankan tergantung mana yang digunakan?
Pacerier
Ini juga berfungsi untuk JavaScript, Berikut adalah daftar Nilai Falsy Untuk Javascript dan ini daftar Falsy Nilai Untuk PHP
Jomar Sevillejo
1
Anda dapat menggunakan sebanyak yang Anda inginkan. Jika ada jumlah ganjil 'poni' (tanda seru) itu akan menjadi TIDAK operasi yang sama dengan !value, dan jika ada jumlah ganjil poni itu akan sama dengan (bool) value.
diamondsea
51

Itu sama (atau hampir sama - mungkin ada beberapa kasus sudut) seperti casting ke bool. Jika $rowingin dilemparkan ke true, maka !! $rowitu juga benar

Tetapi jika Anda ingin mencapai (bool) $row, Anda mungkin harus menggunakan itu - dan bukan ekspresi "menarik";)

viraptor
sumber
2
Terima kasih itu benar-benar masuk akal, saya tidak pernah melihat sesuatu seperti ini dalam bahasa pemrograman lain.
Andrei
16
Menggunakan !!adalah kebiasaan yang tersisa dari pemrograman dalam C (++). Dalam C melakukan pemeran tidak semudah di PHP, Anda bisa mendapatkan banyak masalah yang berbeda, kompilasi peringatan, dan sebagainya. Jadi, orang-orang menggunakan boll !!.
NikiC
1
@nikic - Kedengarannya aneh, IMO ... karena operator!kelebihan muatan, menggunakannya C++akan berbahaya. Anda juga tidak dapat menggunakan struct di C, atau menggunakannya !. Juga jika sesuatu dapat dinegasikan, Anda kemungkinan besar dapat mengembalikannya dari fungsi pengembalian int, yang cukup banyak membuatnya menjadi boolean. Apakah Anda yakin sedang berbicara tentang C?
viraptor
2
Saya sudah melihat !! dalam banyak program C sebagai konversi aman ke 1/0. (Karena boolean benar-benar tidak lain adalah 0 / "bukan nol" dalam C.)
Prof. Falken
1
@ Viraptor, !!tidak ada yang "menarik" seperti yang Anda klaim. Itu semua tempat dari C ke JavaScript.
Pacerier
18

Itu berarti jika $rowmemiliki nilai kebenaran , itu akan mengembalikan true, jika tidak false, mengkonversi ke nilai boolean.

Berikut adalah contoh ekspresi konversi boolean dari php docs.

Expression             Boolean
$x = "";               FALSE
$x = null;             FALSE
var $x;                FALSE
$x is undefined        FALSE
$x = array();          FALSE
$x = array('a', 'b');  TRUE
$x = false;            FALSE
$x = true;             TRUE
$x = 1;                TRUE
$x = 42;               TRUE
$x = 0;                FALSE
$x = -1;               TRUE
$x = "1";              TRUE
$x = "0";              FALSE
$x = "-1";             TRUE
$x = "php";            TRUE
$x = "true";           TRUE
$x = "false";          TRUE
KAMU
sumber
7

"tidak tidak" adalah cara yang mudah dalam banyak bahasa untuk memahami nilai kebenaran apa yang diberikan oleh bahasa pada hasil dari ekspresi apa pun. Misalnya, dalam Python :

>>> not not []
False
>>> not not [False]
True

Itu bisa nyaman di tempat-tempat di mana Anda ingin mengurangi nilai yang kompleks hingga sesuatu seperti "apakah ada nilai sama sekali?".

Steve Bennett
sumber
1

Cara lain yang lebih manusiawi, mungkin lebih sederhana, untuk 'membaca' yang tidak tidak:

  • Pertama '!' melakukan 2 hal: 'mengubah' nilai menjadi boolean, lalu menampilkan kebalikannya. Jadi itu akan menjadi kenyataan jika nilainya 'salah'.

  • Kedua '!' hanya untuk menghasilkan kebalikan dari yang pertama.

Jadi, pada dasarnya, nilai input bisa berupa apa saja, mungkin sebuah string, tetapi Anda menginginkan output boolean, jadi gunakan yang pertama '!'. Pada titik ini, jika Anda ingin TRUE ketika nilai input 'falsy', maka berhenti di sini dan cukup gunakan satu '!'; jika tidak, jika Anda ingin BENAR ketika nilai input 'benar', lalu tambahkan yang lain '!'.

Luca Reghellin
sumber
0

Mari lihat

!$a;

Alih-alih menafsirkan! operator seperti mengambil

Kebalikan dari nilai Boolean di sebelah kanannya

Baca

ambil kebalikan dari ekspresi Boolean di sebelah kanannya

Pada kasus ini

$a;

bisa menjadi ekspresi

jadi begitu

!$a;

begitu juga

!!$a;

dan

!!!$a;

dan seterusnya, karena masing-masing adalah ekspresi yang valid, the! Operator dapat ditambahkan ke masing-masing.

Chris Rutledge
sumber