2009-11-13 90 views
1

我已经看过以下几行代码,我知道它们做了什么,但我不知道第二行是如何工作的(因此如何将它应用于另一种情况)。有人可以解释这行代码吗? (逻辑与作业运算符)

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

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

我也看到代码去像之前如下:

$variable1 = $variable2 = $variable3; 

它没有指定三件事是相同的东西有点简单多复杂,但我发现它无法搜索对于这种类型的东西来找出任何关于它的信息,更不用说找到我遇到的原始代码了。我认为它最初有一个'和'在那里。有谁知道如何搜索具有多个等号的代码,这不仅仅是一个if语句?

对不起,在一个(而且含糊不清)的两个问题和可怕的标题(当我知道名称是什么,如果它像一个十进制语句的东西))。

+0

您可以简单地发布您想要完成的任务,而不是发布一些看似辉煌但神秘的代码段。或者,如果您不得不维护代码并且不明白它的作用,您可以在代码周围的其他代码中发布有问题的代码行吗? – 2009-11-13 23:04:40

+0

谢谢大家,我的记忆失败了我的第二部分的问题(因此我的描述是可悲的),但山姆的答案(http://stackoverflow.com/questions/1732403/can-someone-explain-this-line- of-code-please-logic-operators/1732429#1732429)帮助我记住,我所看到的仅仅是问题第一部分的一个变种。 – 2009-11-13 23:08:27

+0

我实际上并没有试图完成任何事情,也没有维护包含它的代码。我几个月前刚刚遇到了我的问题的第二部分,从那以后一直在努力解决它。问题的第一部分是当我决定最终在SO上发布问题时,我可以处理的最接近的代码(我也不明白)。 – 2009-11-13 23:15:06

回答

5

使用逻辑运算符来跳跃代码: 作为PHP评估与AND运算一条线,如果拳头一部分是假的,第二部分是不计算,因为它不会改变结果。

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

该手册的PHP手册logical operators有一些这样的插图。

多个赋值运算符:赋值运算符将正确的表达式赋给左边的变量。

$variable1 = $variable2 = $variable3; 

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

+0

为所提到的第二个表达式添加了答案。 – 2009-11-13 23:04:47

+0

变量1之前缺少'$',对吧?否则很好的解释。 – phidah 2009-11-13 23:36:19

+0

哇,我怎么错过了。 – 2009-11-14 00:45:48

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

and声明中,首先评估第一个元素;如果这是真的,那么第二个陈述就会被评估,简单的分配应该总是评估为真,我猜。如果第一个元素为假,则不评估第二个元素。

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

0

你看到的是用在许多语言。这是一篇关于在JavaScript中使用它的文章......但它很好地解释了这个概念。

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

+0

感谢您的链接。读过之后,我认为这实际上也解释了我之前见过的第二批代码。我的记忆显然很糟糕。 – 2009-11-13 23:03:10

1

这是基本相同

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

奇怪的语法的确...

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(); 

至于你的第二个问题,运营商=只是一个任务,所以它意味着$变量1的值将被设置为值$ variable2,它将被设置为$ variable3的值。

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

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

0
$variable1 = $variable2 = $variable3; 

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

相关问题