Как получить значение переменной из обратного вызова (callback) в PHP?

Как извлечь переменную $msg из данного кода, используя обратные вызовы ('callbacks') в библиотеке Binance/Websocket/Spot? Я пытался различными способами, но в основном получаю null.
  • 26 января 2024 г. 1:58
Ответы на вопрос 2
Чтобы извлечь значение переменной из обратного вызова (callback) в PHP, вам нужно написать функцию обратного вызова таким образом, чтобы она передавала необходимое значение обратно или изменяла доступную переменную из области видимости, в которой был создан обратный вызов.

Пример кода использования библиотеки Websocket для Binance может выглядеть примерно следующим образом (предполагая, что используется библиотека `binance/php-binance-api`):

```php
require 'vendor/autoload.php';

$api = new Binance\API("<api_key>","<api_secret>");

// Внешняя переменная для сохранения значения из callback
$msgValue = null;

// Callback функция
$callback = function($msg) use (&$msgValue) {
    // Теперь $msg доступен как локальная переменная внутри этой функции
    // Предположим, что $msg это массив с ключом 'e' для события
    if($msg['e'] == 'desiredEvent') {
        $msgValue = $msg; // Сохраняем значение во внешнюю переменную
        // После этого вы можете решить, хотите ли вы остановить websocket
        // При необходимости, здесь можно вызвать функцию, чтобы остановить его
    }
};

// Настройка Websocket вызова
$api->websocket("btcusdt@aggTrade", $callback);

// Остальной код может быть здесь ...
// Если вы хотите остановить websocket после получения сообщения (например, использовав команду exit или die), удостоверьтесь, что это не помешает логике вашего приложения

echo "Программа продолжает работу после Websocket call...\n";

// Теперь переменная $msgValue должна содержать значение из callback, если событие произошло

if ($msgValue !== null) {
    // Делаем что-то с полученным значением из callback
    echo "Полученное сообщение: ";
    print_r($msgValue);
} else {
    echo "Сообщение не было получено.\n";
}

// Важно понимать, что код ниже может выполниться до того, как получено сообщение,
// так как WebSocket работает асинхронно
```

Таким образом, с использованием ключевого слова `use` и пассивной ссылки (&$msgValue), вы можете изменить переменную `$msgValue`, объявленную вне области видимости функции обратного вызова, изнутри этой функции. Тем не менее, поскольку WebSocket работает асинхронно, любые изменения `$msgValue` ипроизойдут только после того, как сообщение будет обработано функцией обратного вызова.
Никак не получить, да и смысла в этом нет. Каллбэк может быть вызван в любое время и неоднократно. Работать с сообщением надо прямо в нём.
Похожие вопросы