ตัวดำเนินการ !== และ ==! มีความหมายต่างกันอย่างสิ้นเชิง
!== - Not Identical (Strict Inequality)
เปรียบเทียบ ทั้งค่าและชนิดข้อมูล (Type) คืนค่า true ถ้าค่าต่างกัน หรือ ชนิดข้อมูลต่างกัน
1 !== 1; // false (ค่าเท่ากัน, ชนิดเท่ากัน int)
1 !== '1'; // true (ค่าเท่ากัน แต่ชนิดต่างกัน: int vs string)
1 !== 2; // true (ค่าต่างกัน)
'hello' !== 'world'; // true
==! - ไม่ใช่ Operator เดียว! (เป็น == + !)
==! ไม่ใช่ Operator เดียว แต่เป็นการรวมของ == (Loose Equality) และ ! (Logical NOT)
$a ==! $b
// เทียบเท่า:
$a == (!$b)
// หรือ
$a == (not $b)
ตัวอย่างเปรียบเทียบ
true == true -> true
var_dump($x ==! $y); // bool(true)
// ลองค่าอื่น
$a = 1;
$b = 0;
var_dump($a !== $b); // bool(true) (1 !== 0)
var_dump($a ==! $b); // bool(true) (1 == !0 -> 1 == true -> true)
$a = 0;
$b = 0;
var_dump($a !== $b); // bool(false) (0 !== 0 -> false)
var_dump($a ==! $b); // bool(true) (0 == !0 -> 0 == true -> false? Wait...)
/*
!$b = !0 = true
$a == !$b -> 0 == true -> false (Loose: 0 == true คือ false)
ผลลัพธ์: bool(false)
*/
var_dump($a ==! $b); // bool(false)
ตารางเปรียบเทียบ
| Expression | หมายความว่า | ใช้เมื่อไหร่ |
|---|---|---|
$a !== $b | $a ไม่เท่ากับ $b (ค่าและ Type) | Strict Comparison (แนะนำ) |
$a ==! $b | $a เท่ากับ (NOT $b) | เกือบไม่มีกรณีใช้จริง (Confusing) |
$a != $b | $a ไม่เท่ากับ $b (ค่า Loose) | Loose Comparison |
!$a == $b | (NOT $a) เท่ากับ $b | Logic Negation |
⚠️ ไม่ควรใช้ ==! ในโค้ดจริง
- อ่านยาก สับสนกับ
!== - ไม่ใช่ Operator มาตรฐาน
- พฤติกรรม Loose Comparison (==) ทำให้ Bug หายาก
แนวทางปฏิบัติที่ดี
// ✅ ใช้ Strict Comparison (===, !==) เป็นหลัก
if ($a !== $b) { ... }
// ✅ ถ้าต้องการ Logical NOT ชัดเจน
if (!($a == $b)) { ... } // หรือ
if ($a != $b) { ... } // Loose
if ($a !== $b) { ... } // Strict
// ✅ ใช้ Parentheses เพื่อความชัดเจน
$result = ($a == (!$b)); // ชัดเจนกว่า $a ==! $b