Something like a callback delegate function in php

前端 未结 3 1573
时光取名叫无心
时光取名叫无心 2020-12-16 13:44

I would like to implement something similar to a c# delegate method in PHP. A quick word to explain what I\'m trying to do overall: I am trying to implement some asynchron

相关标签:
3条回答
  • 2020-12-16 14:00

    How do you feel about using the Observer pattern? If not, you can implement a true callback this way:

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

    Displays: Data is: this is my data

    0 讨论(0)
  • 2020-12-16 14:08

    (Apart from the observer pattern) you can also use call_user_func() or call_user_func_array().

    If you pass an array(obj, methodname) as first parameter it will invoked 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') );
    ?>
    
    0 讨论(0)
  • 2020-12-16 14:19

    I was wondering if we could use __invoke magic method to create "kind of" first class function and thus implement a callback

    Sound something like that, for 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();
    

    Will print HelloWorld

    Hope it'll help ;)

    But I'd prefer the Controller pattern with SPL for such a feature.

    0 讨论(0)
提交回复
热议问题