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)();
}
What are your thoughts on "Calling an invokable in an instance variable"?