【问题标题】:PHP if not empty string and either string = "this" or "that" how to do that?PHP如果不是空字符串并且字符串=“this”或“that”怎么办?
【发布时间】:2012-02-21 08:40:50
【问题描述】:
function test(){
$embedmode = 'normal';
if ( ( $embedmode != '' ) && ( $embedmode != 'normal' || $embedmode != 'popup' || $embedmode != 'popup' ) )
    return "<p>ARVE Error: mode is not set to 'normal', 'popup' or 'special' maybe typo</p>";
elseif ( $embedmode == '')
    $mode = 'default';
else
    $mode = $embedmode;

echo '<pre>';
var_dump($mode);
echo "</pre>";
}
echo test();

这是我的尝试,现在它发出了返回消息,我很头疼,我不知道为什么

【问题讨论】:

  • 取决于任何语言的运算符优先级。
  • 我不是 PHP 专家,但我建议一个直接测试不等式,另一个在比较相等之前否定操作数。否定的结果是什么?

标签: php if-statement var equals-operator


【解决方案1】:

!($var == 'something')($var != 'something') 相同。

执行(!$var == 'something') 将在进行比较之前对 $var 执行布尔运算。 !$var 将返回 false,除非 $var 为空,所以它本质上会说 (false == 'something'),这将是 false。

【讨论】:

    【解决方案2】:

    你的错误逻辑在这里:

    ( $embedmode != 'normal' || $embedmode != 'popup' || $embedmode != 'popup' )
    

    如果$embedmode 等于'normal',则$embedmode != 'popup',所以这整个位都是TRUE。相信你要换||和 &&。

    对于更容易推理的代码,我可能会使用in_arrayswitch,如下所示:

    switch ($embedmode) {
      case 'normal':
      case 'popup':
      case 'special':
        // valid, proceed
        break;
      case '':
        $embedmode = 'default';
        break;
      default:
        trigger_error ("Embed mode '$embedmode' not valid.");
        break;
    }
    

    【讨论】:

    • 大声笑我自己想通了,之后我看了你的帖子。仍然很奇怪,当我在另一种情况下使用 == 时,它起作用了 $iframe = false; if ($provider == "dailymotion" || $provider == "dailymotionlist" || $provider == "youtube" || $provider == "youtubelist" || $provider == "vimeo" || $provider == "collegehumor" || $provider == "funnyordie" || $provider == "bliptv") $iframe = true;
    • @peaceinfo,如果你仔细想想,这并不奇怪。不过,很高兴你明白了。另外两个提示:即使是单行语句,我也喜欢使用括号,这样如果我需要添加一行,事情就不会中断。并且为有效值使用命名常量可能有助于避免拼写错误并使更改更容易。 (即不要使用Magic Numbers。)
    【解决方案3】:

    1) $var != 'something' 说“$var 不是‘某物’”。

    2) !$var == 'something' 说“$var 的否定是‘某物’”。

    这些表达意味着不同的东西。用 $var is 'foobar' 来测试它,你的两句话是:

    1) 'foobar' 不是'某物',并且

    2) 'foobar' 的否定是'某物'

    如您所见,1) 将返回 true,而 2) 将返回 false,因为无论 'foobar' 是什么,它仍然不等于 'something'。

    【讨论】:

    • 好的,谢谢,看起来 test2 没有做我真正想要的事情,我猜想。那么如何让 test1 工作呢?
    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 2023-03-09
    • 2014-07-17
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多