Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在if语句中设置变量的问题_Php - Fatal编程技术网

Php 在if语句中设置变量的问题

Php 在if语句中设置变量的问题,php,Php,以下是示例: if(($test = array('key'=>true)) && $test['key']){ // works } if($test = array('key'=>true) && $test['key']){ // does not work } 为什么需要括号?我的理解是,不管发生什么,它都会先计算第一个条件,然后再计算第二个条件 做这样的作业“安全”吗 使用它是安全的,但在这种情况下,需要使用括号来消除歧义。

以下是示例:

if(($test = array('key'=>true)) && $test['key']){
    // works
}
if($test = array('key'=>true) && $test['key']){
    // does not work
}
为什么需要括号?我的理解是,不管发生什么,它都会先计算第一个条件,然后再计算第二个条件


做这样的作业“安全”吗

使用它是安全的,但在这种情况下,需要使用括号来消除歧义。PHP的规则意味着第二行将按如下方式执行:

if ($test = (array('key' => true) && $test['key'])) { .. }
所以测试将不是一个数组,而是一个bool

不过,在if语句中进行赋值本身并不能真正鼓励可读性,因此您可能希望避免做得太多。

这是语言中的一个问题。在你的第二个陈述中,你基本上是在写这篇文章来进行评估:

$test = array('key'=>true) && $test['key'];
几乎任何语言都会将其理解为:

$test = (array('key'=>true) && $test['key']);

它为
$test
分配两个其他值之间的逻辑
&
评估值。因此,
$test
在计算时要么是
true
要么是
false

我认为PHP中不需要参数。它们是JS格式的


这取决于你所说的“安全”是什么意思。它起作用了。但有些人会认为这是一种糟糕的风格,导致代码不易理解和维护。奥托,K&R积极推荐。这并不让我担心,有时代码会更整洁。

这是因为它迫使解释器在尝试评估if中的任何条件之前执行赋值


没有括号,您只需将
array('key'=>true)和&$test['key']
的结果赋值给$test。

在PHP中,赋值运算符
=
的优先级低于大多数其他运算符。(有关更多信息,请参阅)。此外,使用赋值运算符的表达式的结果是赋值的值。考虑到这一点,考虑你所表达的表达式:

第一个示例:
($test=array('key'=>true))&&&$test['key']
此表达式的第一部分,
($test=array('key'=>true))
计算结果为
array('key'=>true)
(根据上述规则),第二部分计算结果为
true
,因为刚刚设置了键。因此,整个表达式的计算结果为
true

第二个例子:

$test=array('key'=>true)和&$test['key']
根据运算符优先级规则,
$test
将被分配表达式的值
array('key'=>true)和&$test['key']
。前半部分是正确的,但
$test['key']
尚未设置,因此
true&&false
为false,因此
$test
取值
false
,这也是if条件的结果。

啊!我甚至没想过。嗯。谢谢我想它确实做到了
$test=array()
然后
$test['key']
@Jason:在我的开发生涯的早期,像这样的小疏忽让我变得疯狂,并且尽可能清楚地说明了我的操作顺序。有时我的语句看起来有点像Lisp代码,但毫无疑问它们在做什么:)括号是必需的。测试它。只有在单独运行时才需要括号。如果你一个接一个地运行它们,就像你在例子中展示的那样,那么第二个也会计算为true。这就是为什么许多现代语言禁止这种构造和/或使用适当的静态类型来减轻它的影响的原因。在C语言中,人们常常像尤达那样编写代码来捕捉错误:
if(1=x){
——更现代的编译器警告说,如果没有外部的
()
,则其目的是作为一个赋值(它不会改变允许的语法)。除了惯用的while readline(实际上在PHP中主要是中断的)之外,我认为没有理由使用这种容易出现错误的语法。使用多个语句将使意图更加明确,并表明“这就是我想要做的”。