Kemarin saya tersandung ini ketika saya memodifikasi kode PHP yang ditulis oleh orang lain. Saya bingung bahwa perbandingan sederhana ( if ($var ==! " ")
) tidak berfungsi seperti yang diharapkan. Setelah beberapa pengujian saya menyadari bahwa siapa pun yang menulis kode yang digunakan ==!
bukan !==
sebagai operator perbandingan. Saya belum pernah melihat ==!
dalam bahasa apa pun jadi saya bertanya-tanya bagaimana kode ini bisa bekerja dan melakukan beberapa pengujian:
<?php
echo "int\n";
echo "1 !== 0: "; var_dump(1 !== 0);
echo "1 !== 1: "; var_dump(1 !== 1);
echo "1 ==! 0: "; var_dump(1 ==! 0);
echo "1 ==! 1: "; var_dump(1 ==! 1);
echo "bool\n";
echo "true !== false: "; var_dump(true !== false);
echo "true !== true: "; var_dump(true !== true);
echo "true ==! false: "; var_dump(true ==! false);
echo "true ==! true: "; var_dump(true ==! true);
echo "string\n";
echo '"a" !== " ": '; var_dump("a" !== " ");
echo '"a" !== "a": '; var_dump("a" !== "a");
echo '"a" ==! " ": '; var_dump("a" ==! " ");
echo '"a" ==! "a": '; var_dump("a" ==! "a");
?>
Ini menghasilkan output ini:
int
1 !== 0: bool(true)
1 !== 1: bool(false)
1 ==! 0: bool(true)
1 ==! 1: bool(false)
bool
true !== false: bool(true)
true !== true: bool(false)
true ==! false: bool(true)
true ==! true: bool(false)
string
"a" !== " ": bool(true)
"a" !== "a": bool(false)
"a" ==! " ": bool(false)
"a" ==! "a": bool(false)
Operator tampaknya bekerja untuk variabel boolean dan integer, tetapi tidak untuk string. Saya tidak dapat menemukan ==!
dalam dokumentasi PHP atau apa pun tentang hal itu di mesin pencari mana pun (mencoba Google, Bing, DuckDuckGo, tetapi saya curiga mereka mencoba menafsirkannya alih-alih mencari string literal). Adakah yang pernah melihat ini sebelumnya dan dapat menjelaskan perilaku ini?
sumber
Jawaban:
Perbedaannya adalah tidak ada operator
==!
.Ungkapan ini:
Pada dasarnya sama dengan ini:
sumber
Tidak ada
==!
operator di PHPHanya kombinasi
==
dan!
. Hanya operator yang relevan yang hadir di sini==
. Jadi kombinasi==!
akan berfungsi seperti biasa==
, memeriksaEquality
, dan percaya padaku,tidak lain adalah
dan dengan demikian;
Dan
Menggabungkan beberapa karakter operator mungkin tidak selalu berfungsi sebagai operator. misalnya, jika kita ambil
=
dan!
, itu akan berfungsi sebagai operator hanya jika itu dalam pola!=
atau!==
. Ada dapat banyak kombinasi untuk karakter ini seperti!====
,!==!
dll .. dll .. kombinasi Operator harus dalam format yang unik , agar unik , kombinasi yang unik (semua karakter wont menggabungkan dengan semua karakter lain) dan pasti, tanpa ruang antara mereka .Periksa daftar operator di bawah ini;
sumber
<table>
.==!
bukan operator melainkan dua:==
dan!
!
memiliki prioritas lebih tinggi daripada==
Jadi:
"a" !== " ": bool(true)
-> benar karena "a" benar-benar tidak sama dengan """a" ==! " ": bool(false)
-> salah karena "a" tidak sama dengan! ""Dapat ditulis dengan spasi antara == dan!.
sumber
false because "a" is not equals to !" "
! "" artinya dilemparkan ke bool dan meniadakan bahwa "" itu benar dan! "" salah.==!
tidak ada seperti itu. Ini adalah notasi yang agak samar== !
Karena spasi tidak penting dalam operasi itu, Anda bisa dengan mudah menulis
a --> b
, yang dievaluasia-- > b
, tetapi akan terlihat aneh.Jadi, untuk pertanyaan:
"a" ==! " "
akan diuraikan"a" == !" "
. Negasi dari suatu string ditutupi oleh casting , berarti string apa pun kecuali"0"
dan" "
adalah, ketika dicortrue
,.Dengan demikian, ekspresi
"a" == !" "
akan ditransfer:"a" == !" "
"a" == !false
"a" == true
Dan, karena
string "a"
tidak sama denganbool true
, ini mengevaluasi seluruh ekspresifalse
.Jadi, apa moral dari cerita ini? Jangan biarkan diri Anda bingung dengan ruang yang hilang atau salah tempat! :)
sumber
==! bukan operator
==!
sama sekali bukan operator perbandingan php - ini sama dengan== !
(perhatikan spasi)Yaitu
sumber