ตัวดำเนินการ | และ || ทั้งคู่เป็น "OR" แต่ทำงานในระดับต่างกัน
| - Bitwise OR (ระดับ Bit)
เปรียบเทียบ Bit แต่ละตำแหน่ง หาก Bit ใด Bit หนึ่งเป็น 1 ผลลัพธ์จะเป็น 1
$x = 1; // Binary: 0001
$y = 2; // Binary: 0010
$result = $x | $y; // 0011 = 3
echo $result; // 3
|| - Logical OR (ระดับ Boolean)
ประเมิน Operand ทั้งสองเป็น Boolean (True/False) คืนค่า True ถ้าตัวใดตัวหนึ่งเป็น True
$x = 1; // Truthy
$y = 2; // Truthy
$result = $x || $y; // true (1)
echo $result; // 1 (PHP คืนค่า 1 สำหรับ true)
ตัวอย่างเปรียบเทียบ
';
echo '$x || $y = ' . ($x || $y); // 1 (Logical: true = 1)
// กรณีอื่น
$a = 0; $b = 0;
echo '
$a | $b = ' . ($a | $b); // 0
echo '
$a || $b = ' . ($a || $b); // 0 (false)
$a = 5; $b = 3; // 0101 | 0011 = 0111 (7)
echo '
$a | $b = ' . ($a | $b); // 7
echo '
$a || $b = ' . ($a || $b); // 1 (true)
การใช้งานจริง
Bitwise OR (|) - สำหรับ Flags/Permissions
// Permission Flags
const READ = 1; // 0001
const WRITE = 2; // 0010
const EXECUTE = 4; // 0100
const ADMIN = 8; // 1000
$userPerm = READ | WRITE; // 0011 = 3
$adminPerm = READ | WRITE | EXECUTE | ADMIN; // 1111 = 15
// ตรวจสอบ Permission
function hasPermission($userPerm, $required) {
return ($userPerm & $required) === $required; // Bitwise AND
}
echo hasPermission($userPerm, READ); // true
echo hasPermission($userPerm, EXECUTE); // false
echo hasPermission($adminPerm, ADMIN); // true
Logical OR (||) - สำหรับ Condition/Flow Control
// Default Value (Short-circuit)
$name = $inputName || 'Guest'; // ❌ ผิด: คืนค่า Boolean (1/0)
$name = $inputName ?: 'Guest'; // ✅ ใช้ Elvis Operator (PHP 5.3+)
$name = $inputName ?? 'Guest'; // ✅ Null Coalescing (PHP 7+) - แนะนำ
// Condition
if ($user->isAdmin || $user->isModerator) {
// Allow access
}
// Chaining
$value = $a || $b || $c || 'default'; // คืนค่า Truthy แรกที่พบ (แต่ PHP คืน 1 ไม่ใช่ค่าจริง)
⚠️ จุดสำคัญ: PHP คืนค่า Boolean (1/0) ไม่ใช่ Operand ตัวแรก
// JavaScript: คืนค่า Operand ตัวแรกที่ Truthy
let x = 0 || 'hello'; // 'hello'
// PHP: คืนค่า Boolean (1 = true, 0 = false)
$x = 0 || 'hello'; // 1 (true)
var_dump($x); // int(1)
// ถ้าต้องการค่า Operand จริง ใช้ Null Coalescing (??)
$x = 0 ?? 'hello'; // 0 (เพราะ 0 ไม่ใช่ null)
$x = null ?? 'hello'; // 'hello'
$x = $input ?? 'default'; // แนะนำ
สรุป
| Operator | ประเภท | ใช้กับ | คืนค่า | ตัวอย่าง |
|---|---|---|---|---|
| | Bitwise | Integer | Integer | Flags, Permissions, Bitmask |
|| | Logical | Boolean-ish | Boolean (1/0) | Conditions, Control Flow |
?? | Null Coalescing | Any | Operand Value | Default Values (PHP 7+) |