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... } }
Advertisement
Answer
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(['NamespaceMyClass', 'myStaticCallback']); $myObject->processSomething(['NamespaceMyClass::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... });