DEV Community

Freek Van der Herten
Freek Van der Herten

Posted on • Originally published at freek.dev on

★ Calling an invokable in an instance variable

Invokables in PHP are classes that you can use as a function. They have been around since PHP 5.3 and have many interesting use cases. Here's a quick example.

class Invokable
{
    public function __invoke()
    {
        echo 'I have been invoked';
    }
}

You can use it like this:

// outputs 'I have been invoked'
$invokable();

Nice! Now let's use an invokable as an instance variable. Consider this code where we define a new class which has an invokable as an instance variable:

class Foo
{
    /** \Invokable */
    protected $invokable;

    public function __construct(Invokable $invokable)
    {
       $this->invokable = $invokable;
    }

    public function callInvokable()
    {
        // let's implement this
    }
}

Let's see how we could implement that callInvokable function. Your first hunch could be to do this:

public function callInvokable()
{
   $this->invokable();
}

This will blow up because this code tries to call a non-existing function called invokable function on Foo.

To do it right you have three options:

public function callInvokable()
{
    // first option: nice
    call_user_func($this->invokable);

    // second option: ok too
    $this->invokable->__invoke();

    // third option (only avaible for PHP 7): ?
    ($this->invokable)();
}

Top comments (0)