【问题标题】:Can someone explain this line of code please? (Logic & Assignment operators)有人可以解释一下这行代码吗? (逻辑和赋值运算符)
【发布时间】:2009-11-13 22:52:41
【问题描述】:

我已经看过以下几行代码,我知道它们的作用,但我不知道第二行是如何工作的(以及如何将其应用于另一种情况)。

$user = User::model()->findByPk(123);
empty($user->profile) and $user->profile = new Profile();

代码尝试从数据库中查找用户,如果没有配置文件,则创建一个新的供以后使用。

我之前也看到过类似下面的代码:

$variable1 = $variable2 = $variable3;

它做的事情比简单地将三个东西分配为相同的东西要复杂一些,但我发现不可能搜索这种类型的东西来找到任何关于它的信息,更不用说找到我的原始代码了碰到了。我认为它最初在某个地方有一个“和”。有谁知道如何搜索包含多个等号且不仅仅是 if 语句的代码?

很抱歉这两个问题合二为一(而且含糊不清)和糟糕的标题(当我知道名字是什么时,我会修复它,如果它像一个tenary statement的话)。

【问题讨论】:

  • 与其发布一些看似出色但神秘的代码段,您可以简单地发布您想要完成的事情吗?或者,如果您必须维护代码并且不了解它的作用,您能否将有问题的代码行发布到它周围的其他代码的上下文中?
  • 谢谢大家,我对第二部分问题的记忆让我失望了(因此我的描述很糟糕),但 Sam 的回答 (stackoverflow.com/questions/1732403/…) 帮助我记住了我所看到的只是一个问题第一部分的变体。
  • 我实际上并没有尝试完成任何事情,也没有维护包含它的代码。几个月前,我只是遇到了问题的第二部分,从那以后一直在努力解决。当我决定最终将问题发布在 SO 上时,问题的第一部分是我可以解决的最接近的代码(我也不明白)。

标签: php


【解决方案1】:

使用逻辑运算符跳过代码: 由于 php 使用 AND 运算符评估一行,如果第一部分为 false,则不评估第二部分,因为它不会改变结果。

所以在这种情况下,如果empty() 返回真,那么 php 计算右侧。如果empty() 返回 false,则不再进行评估,并且配置文件不受影响。

php 手册logical operators 页面有一些说明。

多重赋值运算符:赋值运算符将右边的表达式赋给左边的变量。

$variable1 = $variable2 = $variable3;

在这种情况下,$variable2 设置为 $variable3 的值 然后 $variable1 设置为 $variable2 的值。 php 手册assignment operators 页面涵盖了这一点。

【讨论】:

  • 将答案添加到提到的第二个表达式中。
  • 变量 1 之前缺少 $,对吗?否则很好的解释。
【解决方案2】:
empty($user->profile) and $user->profile = new Profile();

and 语句中,首先计算第一个元素;如果它是真的,那么第二个语句被评估,简单的赋值应该总是评估为真,我想。如果第一个元素为假,则不计算第二个元素。

您可以在 php 文档中阅读更多关于 operator precedence 的信息。

【讨论】:

    【解决方案3】:

    基本一样

    if (empty($user->profile))
        $user->profile = new Profile();
    

    确实很奇怪的语法...

    【讨论】:

      【解决方案4】:

      您看到的内容用于多种语言。这是一篇在 JavaScript 中使用它的文章……但它很好地解释了这个概念。

      http://css.dzone.com/articles/guard-and-default-operators-ja

      【讨论】:

      • 感谢您的链接。读完之后,我认为这实际上也解释了我之前看到的第二批代码。我的记忆显然很糟糕。
      【解决方案5】:

      这是一种相当奇怪的写法。对于 PHP 表达式,如果第一部分的计算结果为 false,则表达式将停止呈现。

      如果我写的话:

      if (x == 5 and y == 2)
      

      这将测试 x==5,如果是,它将测试 y==2。如果 x != 5,它永远不会测试 y == 2。所以上面的代码使用这个事实来测试 $user->profile 是否为空。如果是,则运行表达式的下一部分,即 $user->profile = new Profile(); 的赋值。基本相同:

      if (empty($user->profile))
          $user->profile = new Profile();
      

      empty($user->profile) ? $user->profile = new Profile();
      

      至于你的第二个问题,操作符=只是一个赋值,所以这意味着$variable1的值将被设置为$variable2的值,而$variable2的值将被设置为$variable3的值。

      PHP 用表达式做了一些非常好的事情,这对学习很有帮助。查看此链接了解更多信息:

      http://us.php.net/manual/en/language.expressions.php

      【讨论】:

        【解决方案6】:
        $variable1 = $variable2 = $variable3;
        

        PHP 中的赋值(通过等号)具有从右到左的优先级。 PHP 中的每个表达式都有一个返回值。所以表达式$variable3的返回值被赋值给$variable2。然后将表达式$variable2 = $variable3的reurn值赋值给$variable1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-06
          • 2013-07-13
          • 1970-01-01
          • 2011-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多