0
/* 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'; }

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

4

3 回答 3

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
}
于 2013-04-27T16:26:29.613 回答
1

你的表情:

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

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

有很多方法可以避免较长形式的重复ifin_array正如@bwoebi 建议的那样,最简单的可能是。

于 2013-04-27T16:36:55.027 回答
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'truefalse

尽管:

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

做:

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

  2. if 'framed'is truereturn true- 当用作布尔值时,非空字符串被解析为 true,因此整个表达式始终为 true。

结果,您以前的代码始终是正确的,而后者则按您的预期工作。编程语言有点严格,除非语言的定义公开允许,否则您不应该依赖心理飞跃。@bwoebi 提出了更短的替换。

于 2013-04-27T16:40:34.010 回答