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






Как вы относитесь к использованию шаблона Наблюдатель? Если нет, вы можете реализовать настоящий обратный вызов следующим образом:
// 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');
Отображает: Данные есть: это мои данные
@ luigi7up Вы можете использовать это, чтобы перебрать $ data в цикле и вызвать функцию обратного вызова для каждого элемента в $ data в цикле for. Так повторители работают в asp, когда вы устанавливаете обратный вызов ondatabound
(Помимо шаблона наблюдателя) вы также можете использовать 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') );
?>
Мне было интересно, можем ли мы использовать магический метод __invoke для создания «своего рода» функции первого класса и, таким образом, реализовать обратный вызов
Звучит примерно так, для 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
Надеюсь, это поможет;)
Но я бы предпочел шаблон контроллера с SPL для такой функции.
Простите, если это глупый вопрос, но каковы преимущества использования принципа обратного вызова в этом случае? Было бы то же самое вызвать doIt (); myCallback (); функции одна за другой? Я получаю ответный вызов в AJAX или шаблон делегата в Objective C или в любом асинхронном случае, но здесь я не понимаю?