我已经看到以下代码行,我知道他们做了什么,但我不知道第二行是如何工作的(因此如何将它应用于另一种情况)。
$user = User::model()->findByPk(123);
empty($user->profile) and $user->profile = new Profile();
代码尝试从数据库中查找用户,如果没有配置文件,则创建一个新用于以后使用。
之前我也见过代码,如下所示:
$variable1 = $variable2 = $variable3;
它做了一些比简单分配三件事要复杂得多的事情,但是我发现找不到任何有关它的信息是不可能找到这种类型的东西,更不用说找到我原来的代码了。遇到了。我认为它最初在那里有'和'。有谁知道如何搜索具有多个等号的代码,而不仅仅是if语句?
很抱歉这两个问题在一个(并且模糊不清)和可怕的标题(当我知道这些名字是什么时,我会解决它,如果它类似于一个tenary陈述)。
答案 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使用表达式做了一些非常好的事情,这对学习非常有帮助。查看此链接以获取更多信息:
答案 5 :(得分:0)
$variable1 = $variable2 = $variable3;
PHP中的赋值(通过等号)具有从右到左的优先级。 PHP中的每个表达式都有一个返回值。因此,表达式$variable3
的返回值已分配给$variable2
。然后,将表达式$variable2 = $variable3
的重新定位值分配给$variable1
。