Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类似于php中的回调委托函数_Php_Oop - Fatal编程技术网

类似于php中的回调委托函数

类似于php中的回调委托函数,php,oop,Php,Oop,我想在PHP中实现类似于c#委托方法的东西。一个简短的词来解释我试图做什么:我试图实现一些异步功能。基本上,一些资源密集型调用在底层系统访问时排队、缓存和调度。当异步调用最终收到响应时,我希望引发回调事件 我在用PHP进行回调时遇到了一些问题。我想出了一个暂时有效的方法,但我不满意。基本上,它涉及传递对对象的引用以及对象上用作回调的方法的名称(将响应作为参数),然后在需要时使用eval调用该方法。由于各种原因,这是次优的,有没有其他人知道的更好的方法 您对使用该模式感觉如何?如果不是,则可以通过

我想在PHP中实现类似于c#委托方法的东西。一个简短的词来解释我试图做什么:我试图实现一些异步功能。基本上,一些资源密集型调用在底层系统访问时排队、缓存和调度。当异步调用最终收到响应时,我希望引发回调事件


我在用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'); 
显示:数据是:这是我的数据(除了观察者模式),您也可以使用或

如果将
数组(obj,methodname)
作为第一个参数传递,它将作为
$obj->methodname()
调用


我想知道我们是否可以使用u invoke magic方法来创建“类”的第一类函数,从而实现回调

对于PHP5.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中的委托模式,或者任何异步情况下,但我不明白?@luigi7up您可以使用它在$data中循环,并为for循环中$data中的每个项调用回调函数。这是在asp中设置ondatabound回调时中继器的工作方式
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();