【问题标题】:Define variable in "IF" does not work in PHP在“IF”中定义变量在 PHP 中不起作用
【发布时间】:2017-07-27 21:59:11
【问题描述】:
...
elseif ($notes = json_decode($op->notes) && isset($notes->newSet)){
           // $notes = json_decode($op->notes);
            $set = \App\Set::find($notes->newSet);
            $setTitle = $set->title;
        }
...

上面的elseif 语句针对$set = \App\Set::find($notes->newSet) 行生成错误Trying to get property of non-object

通过这个elseif块应该意味着$notes被赋值在elseif中并且找到了$notes->newSet的值。

不知道为什么上面的 sn-p 不起作用!仅当我取消注释 // $notes = json_decode($op->notes);

时才有效

PHP版本为7.0.18

【问题讨论】:

  • 提示:运算符优先级。
  • @zerkms:让我想了一会儿,但是是的。
  • @zerkms 这意味着这两个条件被评估为true。那么$notes->newSet是如何设置的呢?!
  • @SaidbakR 请阅读答案。您的表达式被评估为$notes = ( json_decode($op->notes) && isset($notes->newSet) )。没有两个条件,只有一个作业。

标签: php operator-precedence


【解决方案1】:

正如@zerkms 所指出的,由于运算符的优先级,下面的表达式部分

$notes = 

首先被评估,在成功的情况下,

json_decode($op->notes) && isset($notes->newSet)

计算为true,导致$notes 被分配true,而不是您想要的json_decode()d 数据。

要解决此问题,请将赋值括在括号中,它将首先被评估,并且正如@jh1711 所指出的,确保验证解码数据实际上是一个对象(stdClass 的实例) ,而不是数组:

} elseif (($notes = json_decode($op->notes)) instanceof \stdClass && isset($notes->newSet)) {
    $set = \App\Set::find($notes->newSet);
    $setTitle = $set->title;
}

参考见:

【讨论】:

  • 引用@zerkms 评论,你真的要我重复一遍吗?
  • 不,我希望您解释发生了什么以及为什么您的答案实际上有效,或者根本不打扰。尽管这是完全正确的,但他可以通过谷歌搜索“运算符优先级”轻松找到此答案。 SO 不是随意闪现答案,而是帮助人们了解正在发生的事情,以便他们学习和进步。不是针对提出这个问题的人,而是针对将来会回到这个问题的每个人。大多数情况下,简单地刷出一些代码并不能帮助实现这一目标。
  • @giorgio 你更喜欢这个吗?
  • 是的,还有很多! :) 我只想补充一点,您所说的 the right side of the expression= 之后的任何内容(这个表达式实际上包含三个部分)。
  • 我想了更多。 $notes 只应在进入 else if 子句之前,当它是一个对象 - 包含 newSet 属性时,才应该被赋值为真。这可能发生在一些不在问题中的代码中。如果有人想玩一个简化的案例:3v4l.org/OhWcp
猜你喜欢
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2013-09-21
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多