Frage

Ich möchte etwas Ähnliches wie eine C#-Delegatenmethode in PHP implementieren.Ein kurzes Wort, um zu erklären, was ich insgesamt versuche:Ich versuche, einige asynchrone Funktionen zu implementieren.Im Grunde handelt es sich dabei um einige ressourcenintensive Anrufe, die in die Warteschlange gestellt, zwischengespeichert und weitergeleitet werden, wenn das zugrunde liegende System darauf zugreift.Wenn der asynchrone Aufruf endlich eine Antwort erhält, möchte ich, dass ein Rückrufereignis ausgelöst wird.

Ich habe einige Probleme damit, einen Mechanismus für Rückrufe in PHP zu finden.Ich habe eine Methode gefunden, die im Moment funktioniert, aber ich bin damit unzufrieden.Im Wesentlichen geht es darum, einen Verweis auf das Objekt und den Namen der darauf befindlichen Methode zu übergeben, die als Rückruf dient (wobei die Antwort als Argument verwendet wird), und dann bei Bedarf eval zu verwenden, um die Methode aufzurufen.Dies ist aus verschiedenen Gründen nicht optimal. Gibt es eine bessere Möglichkeit, die jemand kennt?

War es hilfreich?

Lösung

(Abgesehen vom Beobachtermuster) können Sie auch verwenden call_user_func() oder call_user_func_array().

Wenn Sie eine bestehen array(obj, methodname) Als erster Parameter wird es aufgerufen als $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') );
?>

Andere Tipps

Wie denken Sie über die Verwendung des Beobachter Muster?Wenn nicht, können Sie auf diese Weise einen echten Rückruf implementieren:

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

Zeigt:Daten sind:das sind meine Daten

Ich habe mich gefragt, ob wir die magische Methode __invoke verwenden könnten, um eine Art erstklassige Funktion zu erstellen und so einen Rückruf zu implementieren

Hört sich ungefähr so ​​an, für 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();

Wird HelloWorld drucken

Hoffe es hilft ;)

Für eine solche Funktion würde ich jedoch das Controller-Muster mit SPL bevorzugen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top