Tra le nuove feature introdotte da PHP 7.1 è particolarmente interessante analizzare quella che consente di gestire in modo più immediato le eccezioni che si verificano quando viene passato alle funzioni un numero di argomenti imprevisto; parliamo per esempio dei casi in cui lo sviluppatore utilizza una funzione che richiede uno specifico numero di argomenti, ipotizziamo almeno 2, ma al momento della chiamata viene passato ad essa un solo argomento o nessuno.
In precedenza, questa particolare situazione veniva gestita dal linguaggio attraverso dei Warning che venivano accompagnati da una notifica "Missing argument" indicante la mancanza di uno o più argomenti per il funzionamento dell'espressione; una funzione come quella proposta di seguito è stata concepita per effettuare la somma di due addendi, motivo per il quale richiede il passaggio di due argomenti:
function sum($x, $y)
{
return $x + $y;
}
Provando a richiamare tale funzione in PHP 5.6 (o con le versioni di PHP 7.x precedenti alla 7.1), si riceveranno i seguenti errori nel caso in cui ad essa vengano passati zero argomenti o un solo argomento:
sum();
// Warning: Missing argument 1 for sum(), called.. on .. and defined in..
// Warning: Missing argument 2 for sum(), called.. on .. and defined in..
sum(8);
// Warning: Missing argument 2 for sum(), called.. on .. and defined in..
In PHP 7.1 abbiamo invece l'eccezione ArgumentCountError che rappresenta nello stesso tempo una conversione e un miglioramento del sistema basato sui Warning:
sum();
// Fatal error: Uncaught ArgumentCountError: Too few arguments to function sum(), 0 passed in.. and exactly 2 expected in..
sum(8);
// Fatal error: Uncaught ArgumentCountError: Too few arguments to function sum(), 1 passed in.. and exactly 2 expected in..
Invece di un Warning viene quindi proposto un "Fatal error" che spiega la natura dell'eccezione verificatasi in fase di esecuzione; come è possibile notare l'interprete di PHP è quindi in grado di rilevare il numero di argomenti richiesto dalla funzione e di individuarne la differenza con quelli effettivamente passati nel corso della chiamata.