【问题标题】:Can I use logical OR || in PHP variable declaractions?我可以使用逻辑或 ||在 PHP 变量声明中?
【发布时间】:2012-10-09 15:28:25
【问题描述】:

此代码有效:

$foo = getFoo();
if (!$foo) $foo = getBar();
if (!$foo) $foo = getJiggy();
if (!$foo) $foo = getWithIt();

我以为我在某处看到了逻辑运算符的简化:

$foo = (getFoo() || getBar() || getJiggy() || ...);

我认为第一个 true 语句会通过,但它只是将 $foo 设置为布尔值 true 而不是 getFoo()getBar() 等的返回值。

有没有像我想的那样简化?

【问题讨论】:

  • 您可能会想到经典的myfunc() or die() 语句。无论如何,不​​,没有办法做你想做的事。 $foo = getFoo() || $foo = getBar()... 会起作用,但是,嗯。
  • 你到底想用这个讨厌的东西解决什么问题? :) 需要有更好的方法...
  • 您可能正在考虑 JavaScript 与 || 运算符的合并行为。您发布的内容可读性很强,应该保持原样。
  • 好吧,我的代码正在寻找一个 imageURL,但如果 imageURL 不存在,它会在不同的(古老的)地方寻找它。我的代码可能已经足够好,但我很好奇如果我有多个其他地方可以查看是否有更好的方法。在后一种情况下,我可能只是使用循环。
  • 如果您正在寻找图像 URL - 为什么不将所有函数调用组合成一个新函数来处理所有可能的结果并使用类似 $foo = getRealFoo();

标签: php logical-operators


【解决方案1】:

对于 JavaScript,foo = bar || baz; 是一个常用的表达式,因为 || 运算符具有合并行为。

对于|| 运算符,PHP 没有这种行为,它返回一个布尔值。因此,您最初发布的代码越冗长:

$foo = getFoo();
if (!$foo) $foo = getBar();
if (!$foo) $foo = getJiggy();
if (!$foo) $foo = getWithIt();

是您最易读、最好的选择。

PHP 5.3 has a shorthand version of the ternary operator, which acts as a coalescing operator:

从 PHP 5.3 开始,可以省略三元运算符的中间部分。表达式 expr1 ?:如果 expr1 的计算结果为 TRUE,则 expr3 返回 expr1,否则返回 expr3。

这将允许您使用:

$foo = getFoo() ?: getBar() ?: getJiggy() ?: getWithIt();

不过,这假设您不必担心兼容性问题。

【讨论】:

    【解决方案2】:

    你可以试试

    $foo = getFoo() or $foo = getBar() or $foo = getJiggy() or $foo = getWithIt();
    var_dump($foo);
    

    输出

    string 'Stop Here' (length=9)
    

    使用的功能

    function getFoo() {
        return false;
    }
    
    function getBar() {
        return false;
    }
    
    function getJiggy() {
        return "Stop Here";
    }
    
    function getWithIt() {
        return "Hello World";
    }
    

    【讨论】:

    • +1 用于回答问题。但是,我不提倡这样做。原始格式更具可读性。
    【解决方案3】:

    您可以使用嵌套三元运算符。比如:

    $foo = (!$foo)? getFoo() : ((!$foo)? getBar() : getJiggy()) ;
    

    【讨论】:

    • 不会按预期工作:当 $foo 未定义时,这将始终分配 getFoo(),否则将分配 getJiggy()。分配完成处理此语句后:$foo = ($foo%2 === 0 ? 1 : ($foo%2 === 1 ? 2 : 0));从不将 foo 设置为 0。如果 $foo 为偶数,则将其设置为 1,如果为奇数,则将其设置为到2,结束。
    【解决方案4】:

    您可以使用较弱的优先级or 并建立一个条件+赋值链,如下所示:

        $foo = getFoo()
    OR  $foo = getBar()
    OR  $foo = getJiggy()
    OR  $foo = getWithIt();
    

    为了可读性和便于其他人理解此类运算符滥用,间距是必不可少的。

    【讨论】:

      【解决方案5】:

      如果你真的想要重写你的代码,你可以使用call_user_func,但这不是一个非常优雅的解决方案:

      $foo = false;//best declare vars before using them, to avoid warnings in strict mode
      $functions = array('getFoo', 'getBar','getJiggy','getWithIt');
      while(!$foo && $func = array_shift($functions))
      {
          $foo = call_user_func($func,null);//replace null with optional parameters
      }
      

      但正如您所见,这将更难以维护......

      【讨论】:

      • 为什么投反对票?我只是评论说这是一个选项,并且我说这不是一个好选项。但是,它可以工作,而这里的其他一些答案却没有
      【解决方案6】:

      试试

      ($foo = getFoo()) || ($foo = getBar()) || ($foo = getJiggy());
      

      【讨论】:

      • @Baba,它很紧凑,很容易认为原作者在$foo == getFoo()中错误地错过了第二个=。它使它更不稳定,更不表达意图。
      • @zzzzBov OP 要求“简化”他的符号。他没有提及可读性或最佳实践。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多