Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP: How to use a class function as a callback [duplicate]

Tags:

oop

php

callback

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...     }         } 
like image 689
SmxCde Avatar asked Mar 10 '15 00:03

SmxCde


2 Answers

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...   }); 

like image 95
MikO Avatar answered Sep 20 '22 13:09

MikO


Since 5.3 there is a more elegant way you can write it, I'm still trying to find out if it can be reduced more

$this->processSomething(function() {     $this->myCallback(); }); 
like image 34
Bankzilla Avatar answered Sep 21 '22 13:09

Bankzilla