Logic 为什么使用&;时此循环返回1&;而不是';和';?

Logic 为什么使用&;时此循环返回1&;而不是';和';?,logic,php,gearman,Logic,Php,Gearman,给我猜这个谜语。。。在while($row=mysql\u fetch\u assoc($result)和$runningOK)循环中,如果使用PHP&&操作符代替和,那么mysql\u fetch\u assoc会严重失败,运行时只返回数字1 我已经试过了mysql\u fetch\u array(),但仍然存在1问题。只有当且仅当我将&替换为和时,才会返回正确的行,就像当前的while语句一样 为了确保这一点,我将调试语句放在了前面、里面和后面。我想知道这是PHP的怪癖还是我无法解释的原因

给我猜这个谜语。。。在
while($row=mysql\u fetch\u assoc($result)和$runningOK)
循环中,如果使用PHP
&&
操作符代替
,那么
mysql\u fetch\u assoc
会严重失败,运行时只返回数字
1

我已经试过了
mysql\u fetch\u array()
,但仍然存在
1
问题。只有当且仅当我将
&
替换为
时,才会返回正确的行,就像当前的
while
语句一样

为了确保这一点,我将调试语句放在了前面、里面和后面。我想知道这是PHP的怪癖还是我无法解释的原因

// Query
$selectQuery = "SELECT * FROM jobs_cache LIMIT 20";
// Run the Selection Query.
$result = mysql_query($selectQuery)
    or die('Query Failed: '.mysql_error());

// Loop through results.
$runningOK = TRUE;
$resubmitList = array();

while($row = mysql_fetch_assoc($result) and $runningOK)
{
    // Resubmit The Job
    try
    {
        $client->addTaskBackground($row['function_name'],$row['job_data']);
        $resubmitList[] = (string)$row['job_cache_id'];
    }
    catch(Exception $e)
    {
        echo "Error adding task for job id: " . $row['job_cache_id'];
        $runningOK = FALSE;
    }
}
试试这个:

while(($row = mysql_fetch_assoc($result)) and $runningOK)
可能存在混淆,因为它正在将
mysql\u fetch\u assoc($result)和$runningOK
评估为TRUE,然后将其分配给
$row
,在本例中,这与
1

如果添加括号,则很可能可以使用
&&
,因为您将正确地分隔这两个求值


我敢肯定,这是另类语法的副作用

这是由于运算符的优先级。有关详细信息,请参阅。。。以下是相关部分

//“&&”的优先级大于 “和”

//表达式的结果(true和false)被分配给$g
//行为类似:($g=(真与假))

$g=true&&false

//常量true被分配给$h,然后忽略false
//行为类似:($h=true)和false)

$h=正确和错误

var_dump($g,$h)

布尔(假)
布尔(真)

因此,使用&&,表达式的结果被指定为true,其计算结果为1。使用and,它的计算结果是mysql函数的结果——我认为这是您想要的结果


顺便说一下,您还可以使用
break
来消除对$runningOK变量的需要。要执行此操作,请从
while
条件中删除
和$runningOK
,并更改
$runningOK=FALSE到<代码>中断赋值运算符
=
和两个逻辑运算符
&&
具有:
&
=
之前执行,而
又在
之前执行

因此,基本上,声明:

$row = mysql_fetch_assoc($result) AND $runningOK
$row = mysql_fetch_assoc($result) && $runningOK
等于:

($row = mysql_fetch_assoc($result)) AND $runningOK
$row = (mysql_fetch_assoc($result) && $runningOK)
虽然声明:

$row = mysql_fetch_assoc($result) AND $runningOK
$row = mysql_fetch_assoc($result) && $runningOK
等于:

($row = mysql_fetch_assoc($result)) AND $runningOK
$row = (mysql_fetch_assoc($result) && $runningOK)

在最后一种情况下,您只是分配值1(如果mysql\u fetch\u assoc返回一个值)或0。

这是因为运算符解析precedence

查看此表以了解:


当您不知道如何解决时,请尽可能多地使用()。

我的钱就在这个解释上。这是一个更大的Gearman Worker内核的一个缩影,在几个部分中使用running ok以确保我们有有效的SQL调用和Worker运行状况。对优先顺序的解释是多么美妙和清晰啊!同时也在1000代表上擦肩而过:)谢谢!我在用冰淇淋庆祝。