Объект недоступен в функции

У меня есть приложение, в котором я подписываюсь на тему о брокере MQTT. Когда сообщение получено, мне нужно обработать данные в сообщении и отправить их тому же брокеру в другой теме. Я использую ветку Lightning PHPMQTT, так как она в хорошем состоянии ( github repo).

Мой сценарий выглядит следующим образом.

<?php
require("./vendor/autoload.php");
/**
 * An example callback function that is not inline.
 * @param  \Lightning\Response $response
 */
function callbackFunction($response) {
    $topic = $response->getRoute();
    $wildcard = $response->getWildcard();
    $message = $response->getMessage();
    echo "Message recieved:\n =============\n Topic: $topic\n Wildcard: $wildcard\n Message:\n $message\n\n";
}
$host = "m21.cloudmqtt.com";
$port = 18256;
$clientID = md5(uniqid()); // use a unique client id for each connection
$username = ''; // username is optional
$password = ''; // password is optional
$mqtt = new \Lightning\App($host, $port, $clientID, $username, $password);
// Optional debugging
$mqtt->debug(true);
if (!$mqtt->connect()) {
    echo "Failed to connect\n";
    exit;
}
// Add a new subscription for each topic that is needed
$mqtt->subscribe('net/raw/#', 0, function ($response) {
    $topic = $response->getRoute();
    $message = $response->getMessage();
    $attributes = $response->getAttributes(); // Returns all the attributes received
    $id = $response->attr('id'); // Gets a specific attribute by key. Returns null if not present.
    echo "Message recieved:\n =============\n Topic: $topic\n Attribute - id: $id\n Message:\n $message\n\n";

  $topic_id = 524;
  $message = "0A";
  $mqtt->publish("test/request/yes".$topic_id, $message, 1);
});
// Callback functions can be inline or by name as a string
$mqtt->subscribe('test/request/#', 0, 'callbackFunction');
// Call listen to begin polling for messages
$mqtt->listen();
?>

Я могу просто подписаться на "net/raw". Обработка тоже хорошо. Проблема возникает при публикации его обратно брокеру. Если соединение, начатое в строке 18, недоступно для функции, и возникает следующая ошибка:

Примечание: неопределенная переменная: mqtt в C:\wamp64\www\sub.php в строке 35

Неустранимая ошибка: необработанная ошибка: вызов функции-члена publish() для null в C:\wamp64\www\sub.php:35 Трассировка стека: 0 [внутренняя функция]: {закрытие}(Object(Lightning\Response)) 1 C:\wamp64\www\vendor\brandonhudson\lightning\Lightning\App.php(353): call_user_func(Object(Closure), Object(Lightning\Response)) 2 C:\wamp64\www\vendor\brandonhudson\lightning\Lightning\App.php(424): сообщение Lightning\App-> ('0A') 3 C:\wamp64\www\sub.php(40): сообщение Lightning\App->listen() 4 {main} в C:\wamp64\www\sub.php в строке 35

Я могу создать новое соединение внутри функции, но я не хочу продолжать открывать и закрывать новые соединения, когда этого будет достаточно. Что я могу сделать, чтобы сделать соединение доступным внутри функции?

1 ответ

Решение

Вы используете замыкание (анонимная функция) в качестве функции обратного вызова для метода response, Для наследования переменных в замыкании вы можете использовать use вместо дополнительных параметров на закрытие.

Таким образом, вы можете изменить вызов response к следующему:

// Add a new subscription for each topic that is needed
$mqtt->subscribe('net/raw/#', 0, function ($response) use ($mqtt) {
    $topic = $response->getRoute();
    $message = $response->getMessage();
    $attributes = $response->getAttributes(); // Returns all the attributes received
    $id = $response->attr('id'); // Gets a specific attribute by key. Returns null if not present.
    echo "Message recieved:\n =============\n Topic: $topic\n Attribute - id: $id\n Message:\n $message\n\n";

    $topic_id = 524;
    $message = "0A";
    $mqtt->publish("test/request/yes".$topic_id, $message, 1);
});
Другие вопросы по тегам