2015-01-11 12 views
5

Tôi có một số kết quả đáng ngạc nhiên khi sử dụng OR dưới dạng OR hợp lý trong php.
Xét đoạn mã sau:PHP HOẶC hành vi đáng ngạc nhiên

$a = false; 
$b = false; 
$c = true; 

# Test 1, using OR and assigning to a variable 
$value = $a OR $b OR $c; 
var_dump($value); 
# return bool(false) but why? 

# Test 2, using OR directly in var_dump 
var_dump($a OR $b OR $c); 
# return bool(true) as expected 

# Test 3, using || and assigning to a variable 
$value = $a || $b || $c; 
var_dump($value); 
# return bool(true) as expected 

# Test 4, using || directly in var_dump 
var_dump($a || $b || $c); 
# return bool(true) as expected 

Tại sao thử nghiệm 1 và thử nghiệm 2 cho kết quả khác nhau mặc dù họ làm các hoạt động logic giống nhau không?

Trả lời

4

Nhà điều hành || và nhà điều hành OR không hoạt động như cũ. Họ không thể được sử dụng hoán đổi cho nhau.

Nếu bạn muốn hành vi ||, thì hãy sử dụng nó. Không sử dụng OR trừ khi bạn đang ở trong tình huống mà || sẽ làm điều sai trái.

Đối với tình hình của bạn, hai dòng sau mã sẽ cư xử giống hệt nhau:

$value = $a OR $b OR $c; 
($value = $a) OR $b OR $c; 

Nói cách khác, mã của bạn là cơ bản chỉ:

$value = $a; 

Nếu bạn sử dụng các nhà điều hành || , sau đó cả hai giống hệt nhau như khi bạn có niềng răng như thế này:

$value = $a || $b || $c; 
$value = ($a || $b || $c); 

Vì biết thêm chi tiết: http://php.net/manual/en/language.operators.precedence.php

+0

Hoàn toàn, tôi ghét phải sống trong một thế giới nơi 'OR' và' || 'là cùng một điều –

+1

Câu trả lời này cần liên kết: http://php.net/manual/vi /language.operators.precedence.php – sectus

+0

@sectus cảm ơn. Làm xong. –

0

Nếu bạn quấn thử nghiệm 1 trong ngoặc đơn, nó sẽ hoạt động như mong đợi:

$value = ($a OR $b OR $c); 

Khi bạn chạy var_dump vào kiểm tra 2, bạn sẽ có được kết quả mong đợi vì var_dump được gói các hoạt động trong ngoặc .

Thường là một ý tưởng hay để bao bọc một phép toán trong dấu ngoặc đơn như thế này, đặc biệt là với phép gán biến.

Ngoài ra, từ khóa "OR" và "||" không cư xử theo cùng một cách. Xem tài liệu tại đây: http://php.net/manual/en/language.operators.logical.php

+0

Tất nhiên là không! –

Các vấn đề liên quan