PHP或/ xor运算符不能像预期的那样工作

时间:2013-04-27 16:22:34

标签: php operators xor

/* Create Theme Rules */
if($selectedTheme=='spring' or 'framed' or 'art' or 'champagne'){
  echo 'yes';
}

我有这样的脚本,只有当$selectedTheme等于上述之一时才会 ,但它会在每个主题上执行。这很好用:

  if(
    ($selectedTheme==('spring') or 
    ($selectedTheme==('framed')) or 
    ($selectedTheme==('art')) or 
    ($selectedTheme==('champagne')))
   )
     { echo 'yes'; }

但这似乎是很多不必要的代码。 我在这里误解了什么?

3 个答案:

答案 0 :(得分:2)

以上你做不到;它只是评估为$selectedTheme=='spring' or true or true or true

更短,更少冗余的版本将是:

if (in_array($selectedTheme, ['spring', 'framed', 'art', 'champagne'])) // PHP 5.4 syntax (use array(...) if you have PHP 5.3 or lower)

你也可以使用没有休息和很多情况的开关:

switch ($selectedTheme) {
    case 'spring':
    case 'framed':
    case 'art':
    case 'champagne':
        // do something
}

答案 1 :(得分:1)

你的表达:

if ($selectedTheme == 'spring' or 'framed' or 'art' or 'champagne')

正在使用由相对较少的编程语言共享的英语or的解释。 or的参数通常是独立的,因此以上是询问所选主题是否等于'spring',或者字符'framed'是(自己的)是真的,还是字符串'art'为true,或字符串'champagne'为true。由于PHP中的任何非空字符串都是正确的,因此表达式总是为真。

有很多方法可以避免重复长篇if;最简单的可能是in_array,正如@bwoebi建议的那样。

答案 2 :(得分:1)

看看评估:

($selectedTheme==('spring') or 
($selectedTheme==('framed')) or 
($selectedTheme==('art')) or 
($selectedTheme==('champagne')))

确实如此:

  1. $selectedTheme'spring'进行比较,如果其true整数表达式为真,否则

  2. $selectedTheme'framed'进行比较 - 如果true整个表达式为真,则

  3. $selectedTheme'art'进行比较,如果其true整数表达式为真,否则

  4. $selectedTheme'champagne'进行比较 - 如果true整个表达式为true,则表达式为false

  5. ,同时:

     ($selectedTheme=='spring' or 'framed' or 'art' or 'champagne')
    

    确实

    1. $selectedTheme'spring'进行比较,如果true整个表达式为真,则

    2. 如果'framed'true返回true - 非空字符串在用作布尔值时被解析为true,因此整个表达式始终为true。

      < / LI>

      结果你以前的代码总是正确的,而后者的代码是你期望的。编程语言有点严格,除非语言的定义公开允许,否则你不应该依赖于精神上的飞跃。 @bwoebi提供了更短的替换。