为什么PHP布尔表达式在分配给变量时变为false

crb*_*aus 1 php boolean-logic drupal variable-assignment boolean-expression

当我将一个布尔表达式的计算结果分配给一个变量时,我在PHP脚本中看到了一个非常奇怪的行为.

当我评估这段代码时......

  <?php var_dump($is_admin or ($logged_in and ($user->uid === $uid))); ?>
Run Code Online (Sandbox Code Playgroud)

......结果是:

  bool(true)
Run Code Online (Sandbox Code Playgroud)

但是,当我将布尔表达式赋值给变量时,例如......

 <?php $can_edit = $is_admin or ($logged_in and ($user->uid === $uid)); ?>
 <?php var_dump($can_edit); ?>
Run Code Online (Sandbox Code Playgroud)

......结果变成:

 bool(false)
Run Code Online (Sandbox Code Playgroud)

是什么导致了这种行为?我正在使用PHP 5.3.10和Drupal 7

Bar*_*mar 5

运算符优先级.or优先级低于=,因此您只需将值is_admin赋给变量.

在表达式周围加上括号:

$can_edit = ($is_admin or ($logged_in and ($user->uid === $uid))); 
Run Code Online (Sandbox Code Playgroud)

或使用||&&,具有更高的优先权:

$can_edit = $is_admin || ($logged_in && ($user->uid === $uid)); 
Run Code Online (Sandbox Code Playgroud)

通常or通常用于分离动作,如:

$stmt = $db->prepare("SELECT ...") or log_error($db->error);
Run Code Online (Sandbox Code Playgroud)

||在计算布尔表达式时使用while .这是不同优先级的原因(您不希望设置$stmt为结果log_error()).