我正在研究PHP套接字服务器和客户端here的基础知识。
然后我偶然发现了这些行(摘自上面链接的第一个例子,发生在while
内):
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
我对阅读部分没问题,并且在阅读时出现错误时关闭连接。
但是下一个if
让我疯狂
首先,我对如何将一个值分配给布尔值感到困惑
其次,我无法完全理解整个表达。
有人可以解释一下内部会发生什么,以及它如何应用于服务器上下文?
P.S。如果没有正确询问问题,请原谅。我对那里发生的事情感到困惑,不知道具体要求什么。
答案 0 :(得分:5)
使用此语句,没有赋值给布尔值。我们正在比较false
的类型和false
的值(真假,不仅仅是0)。您可以阅读here
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ)))
然后
if (!$buf = trim($buf)) {
continue;
}
这与
相同$buf = trim($buf);
if ($buf == false) {
continue;
}
所以,解释原文:
// The assignment happens first and then we're checking the boolean value
if (!$buf = trim($buf))
答案 1 :(得分:1)
以下是代码的解释。
false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))
首先,调用socket_read
,结果存储在$buf
中。然后将$buf
与false
进行比较,以查看它是否为bool
且其值为false
。 (===
同时表示相同的类型和相等)
if (!$buf = trim($buf)) {
continue;
}
在代码的这一部分中,首先修剪$buf
并将结果存储在$buf
中。然后检查$buf
是否为false
。如果为false,continue
将采取措施。
答案 2 :(得分:0)
表达式是可拆分的。
$buf = trim($foo)
$check = !$buf
if ($check) { something(); }
首先得到变量,然后检查它评估为false(可能是false
,可能是null
可能是0
),最后oyu根据该值进行切换信息。
答案 3 :(得分:0)
试试这段代码
<?php
$buf="0 ";// (note the spaces)
//next try changing $buf="1 "; (note the spaces for trim)
echo $buf ."<----Non trimmed buf<br>" ;
$buf= trim($buf);
echo $buf ."<----trimmed buf<br>" ;
echo !$buf ."<----!buf<br>" ;
if (!$buf = trim($buf))
echo "Trimmed buf is false";
else
echo "Trimmed buf is True";
?>
<强>输出强>
0 <----Non trimmed buf
0<----trimmed buf
1<----!buf
Trimmed buf is false