2011-11-22 69 views
0

條件的問題,我有以下代碼:奇怪,如果在PHP

$_SESSION['user_role'] = 1; 

if ($_SESSION['user_role'] != '1' || $_SESSION['user_role'] != '2') { 
    return false; 
} else { 
    return true; 
} 

爲什麼會這樣,如果()總是返回false?

+0

是的!在腳本的開頭有一個session_start()。 – Psyche

回答

9

因爲user_role不能同時爲1 2。讓我們通過所有可能的值:

1: != 2 
2: != 1 
anything else: != 1, != 2 

你可能想如下寫你的條件

if(!($_SESSION['user_role'] == 1 || $_SESSION['user_role'] == 2)) { 
    return false; 
} else { 
    return true; 
} 

這相當於:

if($_SESSION['user_role'] != 1 && $_SESSION['user_role'] != 2)) { 
    return false; 
} else { 
    return true; 
} 

(布爾代數)

你的病情甚至可以寫成沒有if:

return $_SESSION['user_role'] == 1 || $_SESSION['user_role'] == 2; 

PS。不使用魔法值


爲了完整起見,這裏的真值表:

A := user_role == 1 
B := user_role == 2 

    | A | B | !B | !A | A or B | !A or !B | !(A or B) | !A and !B 
--+---+---+----+----+--------+----------+-----------+----------- 
1 | T | F | T | F |  T |  T |  F |   F 
2 | F | T | F | T |  T |  T |  F |   F 
--+---+---+----+----+--------+----------+-----------+----------- 
3 | F | F | T | T |  F |  T |  T |   T 
4 | F | F | T | T |  F |  T |  T |   T 
5 | F | F | T | T |  F |  T |  T |   T 
... 

從表中可以立即看到!(A or B)相當於!A and !B

+0

如果有疑問可以明確邏輯。把它全部整合到一個布爾表達式中會導致混淆,並且...這種問題。 – Joe

+1

是的,但是在這兩個條件之間存在一個「或」而不是「和」。我讀它的方式是:如果user_role不等於1或不等於2(所以它可以等於3,4或任何其他數字)。 – Psyche

+2

@Psyche:如果它是1,那麼它將滿足第二個條件('!= 2')。 2也是一樣,它會是'!= 1'。如果(($ _ SESSION ['user_role'] == 1 || $ _SESSION ['user_role'])或者否定整個表達式或使用'&&'''和'(布爾代數需要這個) – knittl

0

A碼爲你做對:

$condition1 = ($_SESSION['user_role'] != '1'); 
$condition2 = ($_SESSION['user_role'] != '2'); 
$result  = ($condition1 || $condition2); 
var_dump($condition1,$condition1,$result); 

我一直在如果對某些邏輯表達的結果有所懷疑,那麼這樣做是可行的。

+0

+1誰低估了這一點,並沒有捍衛它?對我來說似乎是一種合法的調試技術。 – nickb

+0

@nickb:它不以任何方式回答問題。當然,OP會看到「真,假,真」,「假,真,真」和「真,真,真」中的任何一個,但它不能解釋爲什麼會發生這種情況,以及對OP的誤解是什麼... – knittl