PHP __invoke Magic Method Explained
The __invoke() magic method in PHP allows an object to
be called directly as if it were a function. This article explains the
purpose of the __invoke() method, provides a practical code
example of its implementation, and explores common use cases where
treating objects as callable functions is highly beneficial in modern
PHP development.
What is the __invoke()
Method?
In PHP, magic methods are special methods that override default
actions when certain operations are performed on an object. The
__invoke() method is triggered when you attempt to call an
object instance directly, using parentheses, just like you would call a
standard function or closure.
When a class implements __invoke(), its instances
automatically become “callables.” You can verify this by passing the
object to PHP’s is_callable() function, which will return
true.
Code Example
Here is a simple example demonstrating how to define and use the
__invoke() method within a PHP class:
<?php
class Greeter {
private $greeting;
public function __construct($greeting) {
$this->greeting = $greeting;
}
// The __invoke magic method
public function __invoke($name) {
return "{$this->greeting}, {$name}!";
}
}
// Instantiate the object
$welcome = new Greeter("Hello");
// Call the object directly as a function
echo $welcome("John"); // Output: Hello, John!In this example, $welcome is an object, but by adding
parentheses and arguments ($welcome("John")), PHP
automatically routes the call to the __invoke() method
inside the Greeter class.
Key Use Cases for
__invoke()
1. Single Action Controllers
In modern PHP frameworks like Laravel and Symfony,
__invoke() is frequently used for “Single Action
Controllers.” If a controller only needs to perform one specific action
(e.g., handling a subscription payment or displaying a dashboard), using
__invoke() keeps the routing simple and the class focused
on a single responsibility.
// Routing in Laravel
Route::post('/subscribe', SubscribeController::class);2. Passing Objects as Callbacks
Many PHP functions require a callback (a callable type),
such as array_map(), usort(), or middleware
pipelines. Defining __invoke() allows you to pass an entire
object as a callback while maintaining the object’s internal state and
dependency injections.
class Multiplier {
private $factor;
public function __construct($factor) {
$this->factor = $factor;
}
public function __invoke($value) {
return $value * $this->factor;
}
}
$double = new Multiplier(2);
$numbers = [1, 2, 3, 4];
// Pass the object directly as a callback
$result = array_map($double, $numbers); // [2, 4, 6, 8]3. Implementing the Command Pattern
In software design, the Command Pattern encapsulates a request as an
object. Using __invoke() allows command objects to be
executed cleanly without needing to invent arbitrary method names like
execute(), run(), or
handle().