16

PHP で ac# デリゲート メソッドに似たものを実装したいと思います。私が全体的にやろうとしていることを簡単に説明すると、いくつかの非同期機能を実装しようとしています。基本的に、基盤となるシステムがそれに近づくと、キューに入れられ、キャッシュされ、ディスパッチされる、リソースを大量に消費する呼び出しです。非同期呼び出しが最終的に応答を受信したときに、コールバック イベントを発生させたいと考えています。

PHP でコールバックを実行するメカニズムに問題が発生しています。私は今のところうまくいく方法を思いついたが、私はそれに満足していない. 基本的には、オブジェクトへの参照とコールバックとして機能するメソッドの名前を渡し (応答を引数として受け取る)、必要に応じて eval を使用してメソッドを呼び出します。これはさまざまな理由で最適ではありません。誰かが知っているより良い方法はありますか?

4

3 に答える 3

16

(オブザーバー パターンとは別に)call_user_func()またはも使用できcall_user_func_array()ます。

as first パラメータを渡すと、array(obj, methodname)as として呼び出され$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') );
?>
于 2008-09-07T17:14:11.903 に答える
4

オブザーバーパターンの使用についてどう思いますか? そうでない場合は、次の方法で真のコールバックを実装できます。

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

表示: Data is: this is my data

于 2008-09-07T17:07:47.443 に答える
3

__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 を使用したコントローラー パターンを使用したいと思います。

于 2010-07-01T14:45:36.140 に答える