У меня есть такой код:PHP - доступ внешний класс от анонимного обратного вызова
class Server {
private $stopper;
public function setStopper() { $this->stopper = TRUE; }
public function startServer() {
$consumer = new Consumer();
$consumer->onConsume(function($data) {
global $consumer;
// some processing
if(??) { // how to access stopper here??
$consumer->stop();
// also how to access stopServer() here??
}
});
$consumer->consume();
}
public function stopServer() { ... }
}
Этот код находится в файле, который должен запустить навсегда, если setStopper()
не называется. Пока у меня есть set_time_limit
, чтобы остановить код через некоторое время. Но мне нужно реализовать путь setStopper
, чтобы я мог остановить сервер, когда это было необходимо, а не «через некоторое время».
Мне нужно это, потому что onConsume
подключен к потоковому API и запускает анонимный вызов, когда доступны новые данные, и я не хочу убивать приложение php при тайм-ауте из-за некоторых проблем с блокировкой. Я хочу изящно остановить сервер.
Может ли кто-нибудь рассказать, как получить доступ к stopper
или stopServer
внутри обратного вызова? Могу ли я использовать следующий синтаксис?
...(function($data) use ($this) {...
Я также думал, хранить значение класса внутри обратного вызова, но setStopper
называется динамически и значение не может быть обновлена!
Есть ли лучший способ справиться с этой ситуацией?
Follow Up:php - Dynamically update Singleton class' value
делает обновление '' стопор в 'setStopper' влияют на' $ stopper' внутри обратного вызова? Все ли «по ссылке» в php? –
Объекты есть, да. См. [Здесь] (http://stackoverflow.com/questions/2715026/are-php5-objects-passed-by-reference) –
Хорошо, тогда! Я обновлю свой код и проверю, работает ли его, спасибо и дам вам знать –