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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
16
0
12 072
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

// 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'); 

Отображает: Данные есть: это мои данные

Простите, если это глупый вопрос, но каковы преимущества использования принципа обратного вызова в этом случае? Было бы то же самое вызвать doIt (); myCallback (); функции одна за другой? Я получаю ответный вызов в AJAX или шаблон делегата в Objective C или в любом асинхронном случае, но здесь я не понимаю?

luigi7up 04.06.2011 21:48

@ luigi7up Вы можете использовать это, чтобы перебрать $ data в цикле и вызвать функцию обратного вызова для каждого элемента в $ data в цикле for. Так повторители работают в asp, когда вы устанавливаете обратный вызов ondatabound

SubliemeSiem 14.11.2016 00:42
Ответ принят как подходящий

(Помимо шаблона наблюдателя) вы также можете использовать 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 для такой функции.

Другие вопросы по теме