Search code examples
phpoopcallback

How to use class methods as callbacks


I have a class with methods that I want to use as callbacks.
How can I pass them as arguments?

Class MyClass {
    
    public function myMethod() {
        // How should these be called?
        $this->processSomething(this->myCallback);
        $this->processSomething(self::myStaticCallback);
    }

    private function processSomething(callable $callback) {
        // Process something...
        $callback();
    }

    private function myCallback() {
        // Do something...
    }

    private static function myStaticCallback() {
        // Do something...
    }   
    
}

Solution

  • Check the callable manual to see all the different ways to pass a function as a callback. I copied that manual here and added some examples of each approach based on your scenario.

    Callable


    • A PHP function is passed by its name as a string. Any built-in or user-defined function can be used, except language constructs such as: array(), echo, empty(), eval(), exit(), isset(), list(), print or unset().
      // Not applicable in your scenario
      $this->processSomething('some_global_php_function');
    

    • A method of an instantiated object is passed as an array containing an object at index 0 and the method name at index 1.
      // Only from inside the same class
      $this->processSomething([$this, 'myCallback']);
      $this->processSomething([$this, 'myStaticCallback']);
      // From either inside or outside the same class
      $myObject->processSomething([new MyClass(), 'myCallback']);
      $myObject->processSomething([new MyClass(), 'myStaticCallback']);
    

    • Static class methods can also be passed without instantiating an object of that class by passing the class name instead of an object at index 0.
      // Only from inside the same class
      $this->processSomething([__CLASS__, 'myStaticCallback']);
      // From either inside or outside the same class
      $myObject->processSomething(['\Namespace\MyClass', 'myStaticCallback']);
      $myObject->processSomething(['\Namespace\MyClass::myStaticCallback']); // PHP 5.2.3+
      $myObject->processSomething([MyClass::class, 'myStaticCallback']); // PHP 5.5.0+
    

    • Apart from common user-defined function, anonymous functions can also be passed to a callback parameter.
      // Not applicable in your scenario unless you modify the structure
      $this->processSomething(function() {
          // process something directly here...
      });