这是我的代码:
<?php
require('vendor/autoload.php');
use PhpMqtt\Client\MqttClient;
use PhpMqtt\Client\ConnectionSettings;
$temperature = array();
$server = '<address>';
$port = 1883;
$clientId = 'id';
$connectionSettings = (new ConnectionSettings)
->setKeepAliveInterval(60)
->setLastWillQualityOfService(1);
$mqtt = new MqttClient($server, $port, $clientId, MqttClient::MQTT_3_1);
$mqtt->connect($connectionSettings, true);
$mqtt->subscribe('foo', function ($topic, $message) use ($temperature) {
printf("Received message on topic [%s]: %s\n", $topic, $message);
$obj = json_decode($message);
array_push($temperature, floatval($obj->temp));
echo count($temperature);
}, 0);
$mqtt->loop(true);
我运行这个片段:
php mqtt_recv.php
然后我向上述主题发送几条消息,输出为:
Received message on topic [foo]: {"temp":"20.0"}
1
Received message on topic [foo]: {"temp":"20.2"}
1
Received message on topic [foo]: {"temp":"20.4"}
1
Received message on topic [foo]: {"temp":"20.6"}
1
为什么每次调用时父变量$temperature
都会被清除?
我很确定这取决于使用,use
因为在根级别执行相同的操作会导致预期的行为。阅读文档我理解“继承变量的值来自定义函数时,而不是调用时”,但是在第一次调用之后,变量不应该保留新值吗?
默认情况下,PHP 中的匿名函数通过值而不是引用继承大多数参数。(只有对象通过引用传递。)因此,当您修改 -
$temperature
变量时,您只是更改本地值。要通过引用传递值,您需要在其前面加上与号 (&
) 前缀。下面的示例演示了这种行为,取自您链接的文档页面中的示例#3。使用的是早期绑定。这意味着变量值在定义闭包时被复制。因此,在闭包内部修改$Temperature不会产生任何外部影响,除非它是一个指针,就像对象一样。要修复它,您需要传递$temple变量作为引用(&$temple)。