Worker回调属性,建议增加实例类传入的方式

diyya

MyClass.php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
class MyClass{
public function __construct(){}
public function onWorkerStart(Worker $worker){}
public function onConnect(TcpConnection $connection){}
public function onMessage(TcpConnection $connection, $message) {}
public function onClose(TcpConnection $connection){}
public function onWorkerStop(TcpConnection $connection){}
}
启动脚本 start.php
use Workerman\Worker;
require_once DIR . '/vendor/autoload.php';

// 载入MyClass
require_once DIR.'/MyClass.php';
$my_object = new MyClass();
// 调用类的方法

$worker->on=$my_object;//诸如这样

避免只能这样
$worker->onWorkerStart = array($my_object, 'onWorkerStart');
$worker->onConnect = array($my_object, 'onConnect');
$worker->onMessage = array($my_object, 'onMessage');
$worker->onClose = array($my_object, 'onClose');
$worker->onWorkerStop = array($my_object, 'onWorkerStop');

阅读 202
3个回答

adminv

先看完手册,再来指挥作者

最后我好心回复下你的这个 “基础问题”

  • diyya 2021-11-24

    你强调的“基础问题”并没有说服力,按你这样说法,何必用类库,一切自己写得了。你又不是作者

walkor

感谢你的提议。
如果你觉得每次用类设置回调很麻烦,可以自己定义个函数例如

function worker_bind($worker, $class) {
    $callback_map = [
        'onConnect',
        'onMessage',
        'onClose',
        'onError',
        'onBufferFull',
        'onBufferDrain',
        'onWorkerStop',
        'onWebSocketConnect'
    ];
    foreach ($callback_map as $name) {
        if (method_exists($class, $name)) {
            $worker->$name = [$class, $name];
        }
    }
}

workerman注重精简,只提供必要接口,所以一些可有可无的功能不会加上去。如果今天加一个,明天加一个,workerman会变得臃肿,这个不是大家想看到的。

  • 暂无评论
diyya

谢谢作者的答复,非常有道理

  • 暂无评论