PHP7: Null Coalescing Operator

PHP7 Null Coalescing Operator

PHP7 ha introdotto nel linguaggio delle novità molto utili per ridurre la quantità di codice necessario per effettuare operazioni semplici e ripetitive, come nel caso del Null Coalescing Operator.

A cosa serve il Null Coalescing Operator?

Capita spesso di dover controllare se una variabile o, più spesso, l’indice di un array esiste (isset) prima di usarne il valore ed altrimenti usare un valore di default. Il modo più breve per farlo in PHP5 è usare l’operatore ternario:

$name = isset($_GET['name']) ? $_GET['name'] : 'Mario Rossi';

Piuttosto fastidioso, vero? Ci troviamo a dover ripetere il nome della variabile da utilizzare due volte, quando è piuttosto chiaro che dopo averne controllato l’esistenza vogliamo usarne il valore. Allora i programmatori meno esperti saranno tentati di usare l’operatore ternario abbreviato:

$name = $_GET['name'] ?: 'Mario Rossi';

Anche questo approccio funziona, ma se il valore non esiste viene sollevato un E_NOTICE, pertanto è da evitare.

Ci viene quindi in soccorso PHP7 con il già annunciato Null Coalescing Operator, che ci consente di abbreviare l’istruzione ed evitare ripetizioni superflue:

$name = $_GET['name'] ?? 'Mario Rossi';

Come possiamo notare, la sintassi è molto simile a quella dell’operatore ternario. Dobbiamo scrivere meno codice e il risultato è esattamente quello che ci aspettiamo.

Come funziona il Null Coalescing Operator

Entriamo nel dettaglio del funzionamento di questo nuovo operatore di confronto. Come prima cosa bisogna dire che, a differenza dell’operatore ternario, l’operazione vista in precedenza non solleva un E_NOTICE, perché il Null Coalescing Operator fa due cose:

  • controlla che la variabile esista
  • controlla che la variabile non sia null

Se entrambe le due condizioni risultano vere viene restituito il valore della variabile, altrimenti viene restituito il valore della seconda espressione.
Le seguenti operazioni sono quindi equivalenti:

// Null Coalescing Operator
$name = $_GET['name'] ?? 'Mario Rossi';

// Operatore Ternario
$name = isset($_GET['name']) ? $_GET['name'] : 'Mario Rossi';

// if/else
if (isset($_GET['name']))
  $name = $_GET['name'];
else
  $name = 'Mario Rossi';

È possibile concatenare questo operatore per implementare logiche più complesse:

$foo = [];
$bar = null;
$baz = 1;
$qux = 2;

echo $foo['foo'] ?? $bar ?? $baz ?? $qux; // Output: 1

Particolarità

Se sei un programmatore esperto, ecco qualche chicca, alcune delle quali non sono presenti nemmeno nella documentazione ufficiale.

Espressione, non variabile

Questa nota si trova anche nella documentazione, per cui la vediamo per prima. Si tratta di un dettaglio abbastanza intuitivo che può fare la differenza in casi particolari.

Il Null Coalescing Operator è un’espressione che viene valutata nel risultato di un’espressione, non in una variabile. Sembra scontato e per certi versi lo è. Ciò va tenuto a mente se si vuole ritornare una variabile per riferimento. In particolare, usare la seguente dichiarazione in una funzione che ritorna un riferimento non funziona e solleva un warning:

return $foo ?? $bar;

Precedenza relativa agli operatori ternario e booleano

Il Null Coalescing Operator ha precedenza sull’operatore ternario e l’operatore booleano ha precedenza sul Null Coalescing Operator. Complicato? Vediamolo con due esempi:

var_dump(2 ?? 3 ? 4 : 5); // (2 ?? 3) ? 4 : 5 => int(4)
var_dump(0 || 2 ?? 3 ? 4 : 5); // ((0 || 2) ?? 3) ? 4 : 5 => int(4)

Short-circuit

Hai presente il funzionamento dell’operatore booleano? Se facciamo if (true || $something), l’espressione a destra dell’operatore non viene calcolata. Lo stesso accade con il Null Coalescing Operator:

function foo() {
  echo "executed!", PHP_EOL;
}
var_dump(true ?? foo()); // Output: bool(true)

Se provi ad eseguire questo esempio, noterete che "executed!" non viene stampato, poiché la funzione foo() non viene eseguita.

Conclusione

Abbiamo visto a cosa serve e come usare il Null Coalescing Operator, un nuovo operatore introdotto in PHP7 che può veramente cambiare la vita di noi sviluppatori. Anche tu muori dalla voglia di migrare a questa nuova versione del linguaggio?

 

Non perderti i nostri tutorial!
Iscriverti per ricevere gratuitamente i nostri tutorial via e-mail.

Mattia Migliorini

Full Stack Web Developer e Consulente di Digital Marketing con formazione specifica in ambito e-commerce. Ama tenersi al passo con le tecnologie più recenti per offrire soluzioni sempre più semplici e potenti. È sempre pronto a mettere in discussione le proprie posizioni per ricercare nuove strategie creative.

Potrebbero interessarti anche...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *