代码之家  ›  专栏  ›  技术社区  ›  Blair McMillan

有人能解释一下这行代码吗?(逻辑和分配运算符)

php
  •  1
  • Blair McMillan  · 技术社区  · 16 年前

    我已经看到了下面的代码行,我知道它们是做什么的,但是我不知道第二行是如何工作的(因此也不知道如何将其应用于其他情况)。

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

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

    我以前也见过类似下面这样的代码:

    $variable1 = $variable2 = $variable3;
    

    它做了一些比简单地分配三件事情要复杂得多的事情,但是我发现搜索这种类型的事情是不可能找到关于它的任何信息的,更不用说找到我遇到的原始代码了。我想它最初在某个地方有一个“and”。有人知道如何搜索包含不止一个等号的代码吗?它不仅仅是一个if语句。

    很抱歉这两个问题合在一起(对此含糊其辞)和可怕的标题(如果我知道名字是什么,我会把它修好的,如果它像一个坚持声明)。

    6 回复  |  直到 16 年前
        1
  •  5
  •   Tim Lytle    16 年前

    使用逻辑运算符跳过代码 : 当PHP使用and运算符计算一行时,如果第一部分为假,则不会计算第二部分,因为它不会更改结果。

    所以在这种情况下,如果 empty() 返回true,然后PHP计算右侧。如果 空() 返回false,不会再进行任何计算,也不会影响配置文件。

    PHP手册 logical operators 这页有一些插图。

    多个分配运算符 :赋值运算符将右表达式赋给左侧的变量。

    $variable1 = $variable2 = $variable3;
    

    在这种情况下 $variable2 设置为 $variable3 然后 $variable1 设置为 $2 . PHP手册 assignment operators 这页包括了。

        2
  •  2
  •   SilentGhost    16 年前
    empty($user->profile) and $user->profile = new Profile();
    

    在里面 and 语句,首先对第一个元素进行计算;如果它为真,则对第二个语句进行计算,我假定简单赋值的计算结果应始终为真。如果第一个元素为假,则不计算第二个元素。

    你可以阅读更多关于 operator precedence 在php文档中。

        3
  •  1
  •   Franz    16 年前

    基本上和

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

    很奇怪的语法…

        4
  •  0
  •   Sam    16 年前

    你所看到的有很多种语言。这是一篇在javascript中使用它的文章…但它很好地解释了这个概念。

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

        5
  •  0
  •   Travis    16 年前

    写这篇文章的方式很奇怪。对于php表达式,如果第一部分的计算结果为false,则表达式将停止呈现。

    就像我写的:

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

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

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

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

    至于第二个问题,operator=只是一个赋值,因此它意味着$variable1的值将被设置为$variable2的值,而$variable3的值将被设置为$variable3。

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

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

        6
  •  0
  •   GZipp    16 年前
    $variable1 = $variable2 = $variable3;
    

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

    推荐文章