I'm currently organising Full Stack Europe. It's a conference in Antwerp, Belgium for developers who want to learn across the stack. You can use this link get your ticket with a nice discount.

Calling an invokable in an instance variable

Original – by Freek Van der Herten – 2 minute read

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

Stay up to date with all things Laravel, PHP, and JavaScript.

Every two weeks I send out a newsletter containing lots of interesting stuff for the modern PHP developer.

Expect quick tips & tricks, interesting tutorials, opinions and packages. Because I work with Laravel every day there is an emphasis on that framework.

Rest assured that I will only use your email address to send you the newsletter and will not use it for any other purposes.