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

时间:2009-11-13 22:52:42

标签: php

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

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

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

之前我也见过代码,如下所示:

$variable1 = $variable2 = $variable3;

它做了一些比简单分配三件事要复杂得多的事情,但是我发现找不到任何有关它的信息是不可能找到这种类型的东西,更不用说找到我原来的代码了。遇到了。我认为它最初在那里有'和'。有谁知道如何搜索具有多个等号的代码,而不仅仅是if语句?

很抱歉这两个问题在一个(并且模糊不清)和可怕的标题(当我知道这些名字是什么时,我会解决它,如果它类似于一个tenary陈述)。

6 个答案:

答案 0 :(得分:5)

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

所以在这种情况下,如果empty()返回true,那么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语句中,首先评估第一个元素;如果它是真的,那么第二个语句被评估,简单的赋值应该总是评估为true,我推测。如果第一个元素为false,则不评估第二个元素。

您可以在php docs中阅读有关operator precedence的更多信息。

答案 2 :(得分:1)

它与

基本相同
if (empty($user->profile))
    $user->profile = new Profile();

奇怪的语法确实......

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

这是一种相当离奇的写作方式。使用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();

就你的第二个问题而言,operator =只是一个赋值,所以它意味着$ variable1的值将被设置为$ variable2的值,它将被设置为$ variable3的值。

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

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

答案 5 :(得分:0)

$variable1 = $variable2 = $variable3;

PHP中的赋值(通过等号)具有从右到左的优先级。 PHP中的每个表达式都有一个返回值。因此,表达式$variable3的返回值已分配给$variable2。然后,将表达式$variable2 = $variable3的重新定位值分配给$variable1