Можно использовать замыкание. Тут фишка в том, что надо использовать в замыкании не обычную строковую переменную, а объект, потому что строковая переменная будет передана в виде копии, и не получится её изменить.
В коде я заменил класс Client на его мок.
class Client {
public function miniTicker(array $callbacks) {
foreach ($callbacks as $key => $callback) {
$conn = 'aaaaa';
$msg = 'msg-'.$key;
$callback($conn, $msg);
}
}
}
class Message {
public array $messages = [];
public function addMessage(string $msg) {
$this->messages[] = $msg;
}
}
$message = new Message();
$callbacks = [
'message' => function ($conn, $msg) use ($message) {
$message->addMessage($msg);
},
'ping' => function ($conn, $msg) use ($message) {
$message->addMessage($msg);
}
];
$client = new Client();
$client->miniTicker($callbacks);
var_dump($message->messages);
В результате в конце у нас выводятся все сообщения
https://onlinephp.io/?s=tVK7boQwEOyR-IctkDDSkR8gR4...