【问题标题】:What is this assignment construct called? And can you do it in Php?这个赋值结构叫什么?你能用 PHP 做吗?
【发布时间】:2011-05-10 09:31:58
【问题描述】:

我经常在 Javascript 中使用以下构造:

var foo = other_var || "default_value";

在Javascript中,如果左边是假的,那么右边的值就会被赋值。

它非常方便,省去了编写更长且不必要的显式三元表达式的时间。

这种结构有名字吗?

奖励:在 PHP 中是否有不使用三元运算符的技巧?

PS:另一个变体是如果你没有得到一个真实的值就会抛出一个错误,而不是给出一个默认值:

var foo = something || alert("foo is not set!");

【问题讨论】:

  • 感谢大家的回答,不得不选择一个,但都是正确的。当然这是逻辑 OR :) 也许“模式”这个词会更好地表达我的困惑观察。它非常方便,我以为人们可能已经在上面命名了。对我来说,这几乎就像一个模式。它非常易读且直观易懂。这几乎就像阅读简单的英语。正如 Kos 所观察到的,诀窍在于它完全取决于语言如何评估逻辑 OR。耻辱。
  • 另一个例子。确保函数的不可接受的结果返回 false(或 null 等)通常很有用。但也许代码给出了 0 或 null(可能是您从底层框架调用的另一个例程)。所以你最终会得到类似return var_result || false; 的东西,如果代码的结果是真实的,它会按原样返回,否则你肯定会根据文档返回 false,或者为了你的 api 的一致性。但是,是的,它可以用三元运算符来完成,只是远没有那么酷

标签: javascript expression variable-assignment logical-operators


【解决方案1】:

我相信它只是称为 OR 构造。这里有很多关于使用赋值的好例子: http://php.net/manual/en/language.operators.assignment.php

【讨论】:

    【解决方案2】:

    它是just a logical OR operator。点击链接以获取更多关于 javascript 的信息。

    来自文档中的示例:

    o1=true || true       // t || t returns true
    o2=false || true      // f || t returns true
    o3=true || false      // t || f returns true
    o4=false || (3 == 4)  // f || f returns false
    o5="Cat" || "Dog"     // t || t returns Cat
    o6=false || "Cat"     // f || t returns Cat
    o7="Cat" || false     // t || f returns Cat
    

    编辑:关于奖励,您似乎可以通过执行以下操作对最近版本的 PHP 中的三进制执行类似操作:

    expr1 ?: expr3
    

    From the PHP docs:

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

    我不熟悉 PHP,所以我有兴趣知道结果。

    【讨论】:

    • 感谢您的奖金!我确认它在 PHP 5.3.2 上与 shell 中的一个简单的单行 (php -r 'echo (null?:"dog") . "\n";' echoes "dog") 一起工作;而不是 PHP 5.2.14。假值似乎就像 php empty() 函数一样被评估,所以空字符串是假的,但仅包含零字符的字符串也是假的。
    • @faB - 有趣。我对 PHP 一无所知(除了我今天在文档中读到的内容)。惊讶于它会认为“0”是虚假的,但我想我只是习惯了 javascript。
    【解决方案3】:

    有没有这种类型的名字 构造?

    the logical OR operator

    奖励:有没有技巧可以做到这一点 php不使用三元运算符?

    不,使用 PHP,您只能在 ternay 运算符的帮助下这样做。

    【讨论】:

      【解决方案4】:

      这行得通:

      $mytruevalue = true;
      $foo = $mytruevalue or $foo = "20";
      echo $foo;
      

      上面打印了"1",因为那是true 的字符串表示形式($mytruevalue 为真)。

      $myfalsevalue = false;
      $foo = $myfalsevalue or $foo = "20";
      echo $foo;
      

      然而,这会打印出"20",因为$myfalsevalue 是假的。

      如果两个值都等于false,则不打印任何内容。

      希望这会有所帮助。

      【讨论】:

      • 嘿,这很有趣,我会研究一下。
      • 哦,我明白了。呵呵。很好,右边是作业。但我不确定这是否比普通的三元运算符更可取。由于评估的顺序,它也可能导致更多的隐秘错误,在那里有额外的分配。由于逻辑运算符的简单英文版本,您让我感到困惑。
      • 其实两边都是赋值。不过我完全同意,三元运算符是 PHP 的最佳选择。
      【解决方案5】:

      逻辑或(通常是||)运算符在许多语言中截然不同。

      在某些(如 C、C++)中,它的工作方式如下:“计算左侧;如果为真,则返回 true,否则计算右侧并返回 true否则为真或假。” 这里的结果总是布尔值。

      在其他方面(比如 Javascript、Python,我相信 PHP 也一样)它更像是:“评估左侧;如果为真,则返回,否则评估右侧-hand 端并返回结果。” 然后结果可以是任何类型,您可以执行以下构造:

      a = (b || c); // equivalent to a = b ? b : c;

      或者很花哨:

      function compare(A, B) { // -1 if A<B, 0 if A==B, 1 if A>B
          return B.x - A.x || B.y - A.y;
      }
      

      【讨论】:

      • 接受您的答案(尽管所有答案都是正确的),因为它与我的观察更相关。操作员的不同待遇非常烦人。我想知道是否有任何理由让它不像在 Javascript 中那样运行。由于我在前端代码上花费了大量时间,因此这是我多次使用的模式。三元运算符当然可以,但是用逻辑 OR 编写它的方式使代码更具可读性和直观性。
      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      相关资源
      最近更新 更多