Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

ความแตกต่างระหว่าง | และ || ใน PHP (Bitwise OR vs Logical OR)

ตัวดำเนินการ | และ || ทั้งคู่เป็น "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ประเภทใช้กับคืนค่าตัวอย่าง
|BitwiseIntegerIntegerFlags, Permissions, Bitmask
||LogicalBoolean-ishBoolean (1/0)Conditions, Control Flow
??Null CoalescingAnyOperand ValueDefault Values (PHP 7+)