在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)