#php #callback #publish-subscribe
#php #Обратный вызов #опубликовать-подписаться
Вопрос:
У меня есть класс EventEmitter следующим образом:
Как мне реализовать метод publisher (emit) для перебора всех событий и их вызова? (при этом убедитесь, что все обратные вызовы всегда безопасны для вызова)
class EventEmitter {
private static $events = array(); // all subscriptions
public function __construct() {}
// calls the last subscription on the stack
public function emit() {
}
// adds subscriptions to the stack
public function subscribe($name, $callback) {
if(empty(self::$events[$name]))
self::$events[$name] = array();
array_push(self::$events[$name], $callback);
}
}
$emitter = new EventEmitter;
$error_callback = function($data) {
echo "Error 1. {$data["message"]} n";
};
$error_callback2 = function($data) {
echo "Error 2. {$data["message"]} n";
};
$success_callback = function($data) {
echo "SUCCESS! {$data["message"]} n";
};
Комментарии:
1. Ваш вопрос довольно неясен. Вы создаете три переменные, которые содержат обратные вызовы, но вы ничего с ними не делаете? Где именно вы застряли?
2. Используйте
callable
подсказку типа.3. Какой смысл иметь экземпляры, когда полагаешься на
static $events
массив, а свойства экземпляра отсутствуют?4.
emit
не имеет$event_name
аргумента. Сначала вы хотите «перебрать все события и вызвать их» , затем вы хотите// calls the last subscription on the stack
. Противоречиво.5. Рассмотрим
interface
вместо функций, поскольку нет простого способа обеспечить сигнатуры функций при обратных вызовах, кроме дорогостоящего отражения.