PHP 7.3 considera come sintassi valida la possibilità di richiamare le funzioni con virgola finale. Fino al PHP 7.2 gli unici casi in cui era possibile utilizzare una virgola finale erano:
- nella definizione di namespace raggruppati:
use Foo\Bar\{
Foo,
Bar,
};
- negli array:
$foo = [
'foo',
'bar',
];
Con l'ultima versione di PHP possiamo anche definire funzioni che terminano con una virgola:
unset(
$foo,
$bar,
$baz,
);
Consentire una virgola finale nelle chiamate di funzione rende più facile aggiungere argomenti in molti contesti in cui è comune chiamare una funzione con molti argomenti; specialmente nelle funzioni variadiche.
Una funzione variadica è una funzione che accetta un numero arbitrario di elementi.
Utilizzi comuni
Vediamo una serie di esempi in cui il suo utilizzo durante lo sviluppo risulta essere molto comodo.
echo $twig->render(
'index.html',
compact(
'title',
'body',
'comments',
)
);
$newArray = array_merge(
$arrayOne,
$arrayTwo,
['foo', 'bar'],
);
var_dump(
$whatIsInThere,
$probablyABugInThisOne,
$oneMoreToCheck,
);
Gli esempi appena elencati fanno capo tutti a delle casistiche in cui è necessario passare ad una funzione un numero di argomenti che può cambiare durante lo sviluppo.
Il suo utilizzo non è limitato alle sole funzioni (o costrutti in caso di isset()
o unset()
) ma anche nei metodi di una classe:
class Foo
{
public function __construct(...$args) {
//
}
public function bar(...$args) {
//
}
public function __invoke(...$args) {
//
}
}
$foo = new Foo(
'constructor',
'bar',
);
$foo->bar(
'method',
'bar',
);
$foo(
'invoke',
'bar',
);
E nelle closure:
$bar = function(...$args) {
//
};
$bar(
'closure',
'bar',
);
Casi d'uso non ammessi
Abbiamo visto cosa cambia con la versione 7.3. Vediamo invece cosa resta invariato e quindi non concesso:
- dichiarazione di una funzione/metodo:
function bar($a, $b,) {
//
}
//Parse error: syntax error, unexpected ')', expecting variable (T_VARIABLE) in ... on line 2
- virgole indipendenti:
foo(,);
//Parse error: syntax error, unexpected ',' in ... on line 3
- virgole multiple e iniziali:
foo('function', 'bar',,);
//Parse error: syntax error, unexpected ',', expecting ')' in ... on line 3
foo(, 'function', 'bar');
//Parse error: syntax error, unexpected ',' in ... on line 3