2

我在这里学习 PHP 套接字服务器和客户端的基础知识。

然后我偶然发现了这些行(摘自上述链接的第一个示例,发生在里面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的事情让我发疯了。
首先,我对如何以及需要如何为布尔值赋值感到困惑。
其次,我很难完全理解整个表达。

有人可以解释一下如果发生了什么,以及它如何应用于服务器上下文?

PS如果问题没有正确提出,请原谅。我只是对那里发生的事情感到困惑,不知道具体要求什么。

4

4 回答 4

5

使用此语句,没有分配给布尔值。我们正在比较(true false, 而不仅仅是 0)的类型false和值。false你可以在这里阅读

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))
于 2013-04-05T11:18:58.470 回答
1

这是代码的解释。

false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))

首先,socket_read被调用,结果存储在$buf. 然后$buf与 比较,false看是否为 a bool,其值为false。(===同时表示相同类型和相等)

if (!$buf = trim($buf)) {
    continue;
}

在这部分代码中,首先$buf修剪并将结果存储在$buf. 然后检查是否$buffalse. 如果是假的,continue采取行动。

于 2013-04-05T11:24:49.537 回答
0

表达式是可拆分的。

  • $buf = trim($foo)
  • $check = !$buf
  • if ($check) { something(); }

首先你得到变量,然后检查它是否评估为假(可能是false,可能是null可能0),最后 oyu 根据该信息进行切换。

于 2013-04-05T11:21:53.627 回答
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
于 2013-04-05T11:34:04.457 回答