在PHP IF子句中,何时需要括号来阻止PHP通知?

在PHP IF子句中,何时需要括号来阻止PHP通知?,php,Php,我本以为$x->p永远不会被解析为第一个条件$x=getIt()是正确的,但前两个示例并非如此 IF子句中何时需要括号 <?php if(!$x=getIt() || ($x->p) ){echo('yes1');} else {echo('no1');} if(!$x=getIt() || $x->p ){echo('yes2');} else {echo('no2');} if(!($x=getIt()) || ($x->p) ){echo(

我本以为
$x->p
永远不会被解析为第一个条件
$x=getIt()
是正确的,但前两个示例并非如此

IF子句中何时需要括号

<?php

  if(!$x=getIt() || ($x->p) ){echo('yes1');}
  else {echo('no1');}

  if(!$x=getIt() || $x->p ){echo('yes2');}
  else {echo('no2');}

  if(!($x=getIt()) || ($x->p) ){echo('yes3');}
  else {echo('no3');}

  if(!($x=getIt()) || $x->p ){echo('yes4');}
  else {echo('no4');}

  function getIt(){return false;}
?>

我认为经常使用它是一个好习惯。一旦你开始使用预处理器语言,你肯定会感谢你自己。

我之所以使用大括号,是因为以下原因

  • 它们减少了理解代码所需的工作量
  • 它们提供了开发人员意图的确认
    • 注意:没有错误

      第一个通知说变量x没有声明(因此您以前从未分配过它)

      其他人只是很好地告诉您,$x->p什么都不做,因为$x不是对象,因此没有属性


      关于方括号问题,请参见Marcin所说的其他答案,经常使用它们是一个好习惯。 但在php中,如果if语句体是单行的,则不必使用括号。请参见以下示例:

      if(your condition)
         some php code here;
      
      上面的例子很好,可以使用

      现在,如果if语句的主体有多行代码,则必须使用括号。检查下面的示例

      if(your condition) {
         some php code here; 
         some more code here;
         ....
      }
      
      现在在上面的例子中,括号是必需的。 如果上面没有使用括号,您将无法得到预期的结果,或者您将得到一个错误


      谢谢

      逻辑运算符
      |
      的优先级高于赋值运算符
      =
      。所以

      !$x = getIt() || $x->p
      
      被视为:

      !$x = (getIt() || $x->p)
      
      getIt()
      返回falsy值时,在赋值变量之前,以及在结果被
      反转之前,这将访问
      $x
      的属性

      您需要括号来覆盖此优先级。您也可以使用
      而不是
      |
      ,因为它的优先级较低

      if (!$x = getIt() or $x->p)
      

      IF子句中何时需要括号?简短回答:无需查看PHP运算符优先级表。@Rizier123但我在未使用时收到通知。我会发布结果。正如前文所说,在这种情况下没有必要。如果你做一个表达式,你可能需要它,比如如果((i+1)==j)注意没有错误。它说你应该首先声明你的变量,这通常是为了防止奇怪的错误。另外,这是以前的安全问题,或者是如果您有危险的php.ini配置$x->p没有定义,也不会做任何事情。同意这不是错误,但希望知道我为什么收到通知<代码>如果(!$x=getIt()){echo('yes0');}
      不这样做。如果第一个条件为真,为什么要检查
      $x->p
      ?因为在第一步中将$x指定为假。但是布尔值不是对象。“->”尝试访问对象属性(您可以看到->的作用)。。。看看巴尔马的答案,了解为什么不是每一行都有相同的注意。啊,这是有道理的。谢谢,我认为括号的优先级高于
      | |
      ?括号优先于所有的优先级。我看到你已经回答了我的第二条评论。而且,我从来没有新的
      |
      有任何不同。再次感谢。1)这并没有回答“何时需要”这个直接问题,也没有解释观察到的行为。2) 现在还不清楚这与预处理语言有什么关系。好吧,我可能同意1)但这并不意味着我的答案是错误的,这通常是应该投反对票的。对于2)-您可以使用,即
      #define
      ,它将完全改变您的状况。如果不使用
      {}
      甚至一行代码,那么更痛苦的是,这样的宏,尤其是在展开到多行代码时,可能会破坏整个过程
      if (!$x = getIt() or $x->p)