【问题标题】:Something like a callback delegate function in php类似于 php 中的回调委托函数
【发布时间】:2008-09-07 16:42:07
【问题描述】:

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

我在提出一种在 PHP 中执行回调的机制时遇到了一些问题。我想出了一个现在可行的方法,但我对它不满意。基本上,它涉及传递对对象的引用以及将用作回调的方法的名称(将响应作为参数),然后在需要时使用 eval 调用方法。由于各种原因,这是次优的,有没有人知道的更好的方法?

【问题讨论】:

    标签: php oop


    【解决方案1】:

    (除了观察者模式)您还可以使用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') );
    ?>
    

    【讨论】:

      【解决方案2】:

      您对使用Observer 模式感觉如何?如果没有,您可以通过这种方式实现真正的回调:

      // 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(); 也是一样的。我的回调();功能一个接一个?我明白了 AJAX 中的回调或 Objective C 中的委托模式或任何异步案例的意义,但在这里我不遵循?
      • @luigi7up 您可以使用它来循环 $data 并在 for 循环中为 $data 中的每个项目调用回调函数。这是设置 ondatabound 回调时中继器在 asp 中的工作方式
      【解决方案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 的控制器模式。

      【讨论】:

        猜你喜欢
        • 2013-03-13
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 2012-01-19
        • 1970-01-01
        • 2011-12-24
        • 2014-12-22
        • 1970-01-01
        相关资源
        最近更新 更多