Что-то вроде функции делегата callback в php

Я хотел бы реализовать что-то похожее на ac # делетете метод в PHP. Быстрое объяснение того, что я пытаюсь сделать в целом: я пытаюсь реализовать некоторые асинхронные функции. В основном некоторые ресурсоемкие вызовы, которые попадают в очередь, кэшируются и отправляются, когда базовая система приближается к ней. Когда асинхронный вызов, наконец, получит ответ, я бы хотел, чтобы событие обратного вызова было поднято.

У меня возникли проблемы с механизмом выполнения обратных вызовов в PHP. Я придумал метод, который работает сейчас, но я недоволен этим. В основном это включает передачу ссылки на объект и имя метода на нем, который будет служить в качестве обратного вызова (принимая ответ в качестве аргумента), а затем использовать eval для вызова метода, когда это необходимо. Это неоптимально по целому ряду причин, есть ли лучший способ сделать это, о котором все знают?

(Помимо шаблона наблюдателя) вы также можете использовать call_user_func() или call_user_func_array() .

Если вы передадите array(obj, methodname) качестве первого параметра, он будет вызываться как $obj->methodname() .

 <?php class Foo { public function bar($x) { echo $x; } } function xyz($cb) { $value = rand(1,100); call_user_func($cb, $value); } $foo = new Foo; xyz( array($foo, 'bar') ); ?> 

Как вы относитесь к использованию шаблона Observer ? Если нет, вы можете реализовать настоящий обратный вызов следующим образом:

 // This function uses a callback function. function doIt($callback) { $data = "this is my data"; $callback($data); } // This is a sample callback function for doIt(). function myCallback($data) { print 'Data is: ' . $data . "\n"; } // Call doIt() and pass our sample callback function's name. doIt('myCallback'); 

Дисплеи: данные: это мои данные

Мне было интересно, можем ли мы использовать метод __invoke magic для создания «вид» функции первого класса и, таким образом, реализовать обратный вызов

Звучит примерно так, для PHP 5.3

 interface Callback { public function __invoke(); } class MyCallback implements Callback { private function sayHello () { echo "Hello"; } public function __invoke () { $this->sayHello(); } } class MySecondCallback implements Callback { private function sayThere () { echo "World"; } public function __invoke () { $this->sayThere(); } } class WhatToPrint { protected $callbacks = array(); public function register (Callback $callback) { $this->callbacks[] = $callback; return $this; } public function saySomething () { foreach ($this->callbacks as $callback) $callback(); } } $first_callback = new MyCallback; $second_callback = new MySecondCallback; $wrapper = new WhatToPrint; $wrapper->register($first_callback)->register($second_callback)->saySomething(); 

Будет печатать HelloWorld

Надеюсь, это поможет;)

Но я бы предпочел шаблон Controller с SPL для такой функции.