PHP __invoke

Summary: in this tutorial, you’ll learn about the PHP __invoke() magic method and how to use it effectively.

Introduction to the PHP __invoke() magic method

Suppose that you have a class called MyClass:

class MyClass 
{
    // ...
}Code language: PHP (php)

Typically, you create a new instance of the MyClass and access its methods and properties like this:

$instance = new MyClass();
$instance->methodName();Code language: PHP (php)

Or if the MyClass has static methods, you can access them using the :: operator:

MyClass::staticMethod();Code language: PHP (php)

Besides using the MyClass these ways, PHP allows you to use the object of the class as a function. For example:

$instance($arguments);Code language: PHP (php)

In this case, PHP will call the __invoke() method of the MyClass. For example:

<?php

class MyClass
{
    public function __invoke(...$arguments)
    {
        echo 'Called to the __invoke method';
    }
}

$instance = new MyClass;
$instance();Code language: PHP (php)

Output:

Called to the __invoke methodCode language: PHP (php)

The $instance is known as a function object or functor.

The __invoke() magic method has the following syntax:

__invoke( ...$values): mixedCode language: PHP (php)

PHP will call the __invoke() magic method when you call an object as a function.

Also, the object of the class that implements the __invoke() magic method is a callable. For example:

echo is_callable($instance) ? 'yes' : 'no'; // yesCode language: PHP (php)

In this example, the $instance of the MyClass is a callable. This means that you can pass it to any function or method that accepts a callable.

Practical PHP __invoke() magic method example

Suppose that you have an array of customer data like this;

$customers = [
    ['id' => 1, 'name' => 'John', 'credit' => 20000],
    ['id' => 3, 'name' => 'Alice', 'credit' => 10000],
    ['id' => 2, 'name' => 'Bob', 'credit' => 15000]
];Code language: PHP (php)

To sort the customers by name or credit, you can use the usort() function. The second parameter of the usort() function is a callable that determines the sort order:

usort(array &$array, callable $callback): bool
Code language: PHP (php)

The following defines the class Comparator that implements the __invoke() magic method:

<?php

class Comparator
{
    private $key;

    public function __construct(string $key)
    {
        $this->key = $key;
    }

    public function __invoke($a, $b)
    {
        return $a[$this->key] <=> $b[$this->key];
    }
}Code language: PHP (php)

The __invoke() method returns the result of the comparison of two array elements by a specified key.

To use the Comparator class, you can create a new instance of the class and pass it to the usort() function as follows:

usort($customers, new Comparator('name'));Code language: PHP (php)

This statement sorts the customers by name.

To sort the customers by credit, you can use the credit as the key like this:

usort($customers, new Comparator('credit'));Code language: PHP (php)

Put it all together.

<?php

class Comparator
{
    private $key;

    public function __construct(string $key)
    {
        $this->key = $key;
    }

    public function __invoke($a, $b)
    {
        return $a[$this->key] <=> $b[$this->key];
    }
}

$customers = [
    ['id' => 1, 'name' => 'John', 'credit' => 20000],
    ['id' => 3, 'name' => 'Alice', 'credit' => 10000],
    ['id' => 2, 'name' => 'Bob', 'credit' => 15000]
];

// sort customers by names
usort($customers, new Comparator('name'));
print_r($customers);

// sort customers by credit
usort($customers, new Comparator('credit'));
print_r($customers);Code language: PHP (php)

Summary

  • Use the __invoke() magic method is invoked when you call an object as a function.
  • An object of a class that implements the __invoke() is known as a function object or functor. It’s also a callable.
Did you find this tutorial useful?