Making call_user_func_array more readable
There's a lot PHP 7 love going around these days, but PHP 5.6 has it's fair share of nice features too. One of those features is the splat operator. It looks like this: ...
.
The splat operator can capture a variable number of arguments.
function logThis(...$messages)
{
foreach ($messages as $message) {
echo $message.PHP_EOL;
}
}
logThis('one', 'two', 'three');
You can still use regular arguments as well:
function logThis($firstMessage, ...$otherMessages)
{
echo "superimportant: {$firstMessage}".PHP_EOL;
foreach ($otherMessages as $message) {
echo $message.PHP_EOL;
}
}
logThis('one', 'two', 'three');
Another usage for the splat operator is argument unpacking:
$messages[] = "one";
$messages[] = "two";
$messages[] = "three";
logThis(...$messages);
The operator can also help replacing usages of call_user_func_array
to something more readable. Consider this contrived example where all calls to a class are forwarded to a dependency.
class ClassA
{
protected $classB;
public function __construct(ClassB $classB)
{
$this->classB = $classB;
}
public function __call($method, $args)
{
call_user_func_array([$this->classB, $method], $args);
}
}
Using this splat operator this can be rewritten to:
class ClassA
{
protected $classB;
public function __construct(ClassB $classB)
{
$this->classB = $classB;
}
public function __call($method, $args)
{
$this->classB->$method(...$args);
}
}
Do you know some other cool usage of the operator? Let me know in the comments below.
What are your thoughts on "Making call_user_func_array more readable"?