PHP中是否有海象操作符?

4
在 Python3.8 中引入了一种名为“海象运算符”(:=)的新运算符,它可以在条件语句中声明并赋值变量。我用 PHP 写了一个简单的 TCP 套接字连接,希望让我的程序更美观。
在 PHP: Hypertext Preprocessor 中是否有类似的东西?
if ($data := socket_read ($socket, 1024)) {
     echo $data;
}

2
不叫海象运算符,但功能相同。只需删除“:”。 - jrswgtr
你目前尝试了什么?你卡在哪里了?这与通常的“=”赋值有何不同? - Nico Haase
@NicoHaase 我不知道我们可以在条件语句中使用 = 运算符来赋值元素。 - harabatahat
2个回答

6

socket_read()的返回值为“真”或“假”时,此代码将运行。

“假”可以是''0[]nullfalse

“真”是指其他任何值。

if ( $data = socket_read($socket, 1024) ) {
     echo $data;
}

如果你想更具体一些,你甚至可以按照以下步骤进行操作(感谢@Benni):

if ( 'foo' === $data = socket_read($socket, 1024) ) {
    echo 'data equals foo';
}

或者
if ( is_array($data = socket_read($socket, 1024) ) {
    var_dump($data);
}

如果您不确定 socket_read() 返回的是一个 string,那么您的示例可能会抛出异常。

在这种情况下,您可以执行以下操作:

if ( is_string($data = socket_read($socket, 1024)) ) {
     echo $data;
}

请参见https://www.php.net/manual/zh/language.types.boolean.php,了解关于PHP布尔值行为的更多信息。

1
当你想要更具体时,可以像这样扩展你的表达式:if ('foo' === $data = socket_read($socket, 1024)) { ... 或者甚至是 if (is_array($data = socket_read($socket, 1024)) { ... - Benni
谢谢@Benni。我已经将示例添加到答案中了! - jrswgtr

2

我想为这个问题添加更多的背景信息,或许将来其他人会发现它有用。

PHP没有(或者更重要的是,不需要)海豹运算符的原因在于,在PHP中,赋值运算符=既是语句又是表达式。

当你写

$var = 'foo';

你不仅将值foo赋给了$var,而且整个语句都会被评估为它:

php > var_dump($var = 'foo');
string(3) "foo"

在PHP条件语句中使用=并不是在该上下文中魔法般覆盖运算符,而是赋值本身就是表达式的自然副作用。但在Python中,情况并非如此。赋值运算符(同样是=)仅仅是一个语句,它本身没有结果,因此不能在条件语句中使用。随着v3.8的推出,新增了海象运算符作为一种弥补这种差距的方式。更多关于这个问题的讨论可以参见以下问题:Can we have assignment in a condition?“:=” syntax and assignment expressions: what and why?。请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接