---
title: "Ragionando in PHP 7 lezione 2: operatore di confronto combinato Spaceship"
description: "Lezione 2 su PHP 7: l'operatore di confronto combinato Spaceship, che permette il confronto ternario tra due scalari in una sola riga. Lezioni di PHP 7 mirate all'apprendimento delle differenze tra PHP 5.6 e la nuova versione di PHP 7.0 rilasciata nel 201"
canonical: "https://www.mauriziofonte.it/blog/post/php7-lezione-2-operatore-spaceship.html"
author: "Maurizio Fonte"
date: "2018-03-02T11:52:06+01:00"
modified: "2018-03-02T11:52:06+01:00"
section: "PHP"
tags: ["PHP"]
license: "Riuso e citazione consentiti con attribuzione e link alla fonte"
---

[PHP](https://www.mauriziofonte.it/blog/cat/php.html)

# [Ragionando in PHP 7 lezione 2: operatore di confronto combinato Spaceship](https://www.mauriziofonte.it/blog/post/php7-lezione-2-operatore-spaceship.html)

Venerdì 2 Marzo 2018, alle 11:52 ![Ragionando in PHP 7 lezione 2: operatore di confronto combinato Spaceship](https://www.mauriziofonte.it/image/000510200-php7-lezione-2-operatore-spaceship.jpg)

Una notevole miglioria di PHP7 è senza ombra di dubbio l'inserimento di un operatore di confronto combinato che viene chiamato **Spaceship**per semplicità comunicativa: infatti è un **operatore di confronto** che assomiglia tantissimo ad una navetta spaziale stilizzata, un pò come se fosse una emoticon.

Questo operatore è semplicemente definito come **<=>**

È un operatore che va utilizzato per la **comparazione di scalari**, quindi, di numeri interi, bool, float, e stringhe, ma anche per la **comparazione di Array e Oggetti**. Ecco un esempio:

```
<?php
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
```

La particolarità di questo operatore è che al posto di definire un "vero o falso", come accade per i suoi fratelli <, >, <= e >=, la sua mappa di verità è leggermente diversa, e permette di avere 3 stati di ritorno:

- 0:  se entrambe le espressioni sono UGUALI
- 1: se l'espressione di SINISTRA è maggiore
- -1: se l'espressione di DESTRA è maggiore

Ora, ragionando un secondo su espressioni scalari "stringa", questo operatore fa quello che ha sempre fatto la funzione strcmp di php.

```
<?php
// qui è chiaramente visibile il comportamento dell'operatore Spaceship, che è assolutamente identico alla funzione strcmp per le stringhe
$a = 'aeroporto';
$b = 'piscina';
echo strcmp ( $a, $b ); // -1
echo $a <=> $b; // -1
```

La vera potenza di questo operatore è che rende la scrittura di funzioni di ordinamento custom molto più veloce da scrivere: ecco un esempio di stessa identica funzione di ordinamento custom, usando il "vecchio" triplo if, e usando il nuovo operatore Spaceship:

```
<?php
$numeri = [ 0 => [ 'v' => 10 ], 1 => [ 'v' => 20 ], 2 => [ 'v' => 30 ], 3 => [ 'v' => 10 ], 4 => [ 'v' => 40 ], 5 => [ 'v' => 40 ] ];

// vecchio metodo di ordinamento
usort ( $numeri, function ( $n1, $n2 ) {
if ( $n1['v'] == $n2['v'] ) return 0;
else if ( $n1['v'] < $n2['v'] ) return 1;
else return -1;
});

// nuovo metodo di ordinamento
usort ( $numeri, function ( $n1, $n2 ) {
return $n1['v'] <=> $n2['v'];
});
```

Vediamo invece qualche esempio di confronto tra più di un tipo di variabile e i relativi ritorni di verità:

```
<?php
// Interi
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Float
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Stringhe
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1
// Array
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1
// Oggetti
$a = (object) ["a" => "b"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 0
$a = (object) ["a" => "b"];
$b = (object) ["a" => "c"];
echo $a <=> $b; // -1
$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 1
// solo i valori vengono confrontati, non le chiavi: in questo caso i valori sono "b" e "b" in entrambi gli oggetti
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b; // 0
```

La migliore applicazione di questo comparatore è l'utilizzo in **funzioni di ordinamento custom:**

```
<?php
class Veicolo {
public $nome;
public $velocitaMassima;
public function __construct ( string $nome, int $velocitaMassima ) {
$this -> nome = $nome;
$this -> velocitaMassima = $velocitaMassima;
}
}

$veicoli = [
new Veicolo ( 'Panda', 160 );
new Veicolo ( 'Punto', 180 );
new Veicolo ( 'Giulia', 240 );
new Veicolo ( 'Ape', '50' );
new Veicolo ( 'Ducato', 160 );
new Veicolo ( 'Z4', 240 );
];

// ordinamento per nome
usort ( $veicoli, function ( $v1, $v2 ) {
return $v1 -> nome <=> $v2 -> nome;
});
echo $veicoli[0] -> name;  // Ape

// ordinamento per velocità massima
usort ( $veicoli, function ( $v1, $v2 ) {
return $v1 -> velocitaMassima <=> $v2 -> velocitaMassima;
});
echo $veicoli[0] -> name;  // Giulia
```

Vediamo come si comporta l'operatore Spaceship di PHP 7 quando utilizzato su ordinamenti di valori multipli. Questa tecnica semplifica enormemente l'ordinamento di array o oggetti basando l'ordinamento su più chiavi.

```
<?php
usort ( $veicoli, function ( $v1, $v2 ) {
return [ $v1 -> velocitaMassima, $v1 -> nome ] <=> [ $v2 -> velocitaMassima, $v2 -> nome ];
});
foreach ( $veicoli as $veicolo ) {
echo 'La velocità massima di "' $veicolo -> nome . '" è ' . $veicolo -> velocitaMassima . '\n';
}
// Stampa:
// La velocità massima di "Ape" è 50
// La velocità massima di "Ducato" è 160
// La velocità massima di "Panda" è 160
// La velocità massima di "Punto" è 180
// La velocità massima di "Giulia" è 240
// La velocità massima di "Z4" è 240
```

Sfruttando la comparazione di array, questa funzione di ordinamento ha richiesto 1 sola riga per essere scritta, al posto delle 6 o 7 richieste precedentemente.

Questa era la seconda lezione su PHP 7. Naviga nella **categoria PHP7** di questo blog per scoprire le altre lezioni e le novità introdotte da PHP7.

Dall'articolo al lavoro vero

Se il codice di cui parla questo articolo è il tuo

Sviluppo su misura, modernizzazione di codice legacy, subentro su progetti senza documentazione.

[Vedi tre interventi con i numeri](https://www.mauriziofonte.it/programmatore-php.html) Ultima modifica: Venerdì 2 Marzo 2018, alle 11:52 [« Articolo precedenteRagionando in PHP 7 Lezione 1: Tipizzazione scalare27 Febbraio 2018](https://www.mauriziofonte.it/blog/post/php7-lezione-1-tipizzazione-scalare.html)[Articolo successivo »Miglior server VPS 2018: Digital Ocean3 Marzo 2018](https://www.mauriziofonte.it/blog/post/miglior-hosting-2018-digital-ocean.html)

### Articoli correlati a Ragionando in PHP 7 lezione 2: operatore di confronto combinato Spaceship

- [Cosa arriva in PHP 8.6 e se conviene aggiornare subito](https://www.mauriziofonte.it/blog/post/php-8-6-novita-partial-function-application-quando-aggiornare.html)

  Il 19 novembre esce PHP 8.6, e per la prima volta da anni la feature di punta non è zucchero sintattico: la partial function application chiude · 12 Novembre 2026

  ![Cosa arriva in PHP 8.6 e se conviene aggiornare subito](https://www.mauriziofonte.it/image/005840070-php-8-6-novita-partial-function-application-quando-aggiornare.jpg)
- [Le prime quarantotto ore di PHP2Shell viste da un sensore](https://www.mauriziofonte.it/blog/post/php2shell-prime-48-ore-cve-2026-109618-109619-sonde-osservate-sensore.html)

  Gli avvisi di sicurezza di PHP sono stati pubblicati alle 13:34 UTC. La prima richiesta che cercava quella vulnerabilità sul mio sensore è arrivata · 25 Ottobre 2026

  ![Le prime quarantotto ore di PHP2Shell viste da un sensore](https://www.mauriziofonte.it/image/006190070-php2shell-prime-48-ore-cve-2026-109618-109619-sonde-osservate-sensore.jpg)
- [Come funziona la use-after-free di PHP2Shell nelle CVE-2026-109618 e CVE-2026-109619](https://www.mauriziofonte.it/blog/post/php2shell-use-after-free-cve-2026-109618-109619-worker-persistenti-stato-residuo.html)

  Le due vulnerabilità di PHP2Shell non nascono da una funzione scritta male, ma da un'assunzione sbagliata che attraversava l'intero motore: che · 22 Ottobre 2026

  ![Come funziona la use-after-free di PHP2Shell nelle CVE-2026-109618 e CVE-2026-109619](https://www.mauriziofonte.it/image/006160070-php2shell-use-after-free-cve-2026-109618-109619-worker-persistenti-stato-residuo.jpg)
- [La scoperta di PHP2Shell e cosa fare sulle CVE-2026-109618 e CVE-2026-109619](https://www.mauriziofonte.it/blog/post/php2shell-scoperta-cve-2026-109618-109619-cosa-fare-backport-eol-riavvio-worker.html)

  Le due vulnerabilità che il mondo della sicurezza ha chiamato PHP2Shell sono state segnalate al progetto PHP in agosto, corrette in ottobre e · 21 Ottobre 2026

  ![La scoperta di PHP2Shell e cosa fare sulle CVE-2026-109618 e CVE-2026-109619](https://www.mauriziofonte.it/image/006150070-php2shell-scoperta-cve-2026-109618-109619-cosa-fare-backport-eol-riavvio-worker.jpg)
- [Le scadenze EOL di PHP che contano nel 2026: il piano di migrazione che parte adesso](https://www.mauriziofonte.it/blog/post/scadenze-eol-php-2026-piano-migrazione-parte-adesso.html)

  Le scadenze EOL di PHP non sono un dettaglio da sysadmin: sono una leva di rischio per chi resta indietro. Lo stato reale nel 2026, con le date · 30 Settembre 2026

  ![Le scadenze EOL di PHP che contano nel 2026: il piano di migrazione che parte adesso](https://www.mauriziofonte.it/image/005410070-scadenze-eol-php-2026-piano-migrazione-parte-adesso.jpg)

---

**Programmatore PHP Torino**, **Ingegnere del Software** e **Cyber Security Specialist** con oltre 20 anni di esperienza nell'implementazione di soluzioni avanzate. Eseguo **porting di vecchi ambienti PHP** verso release più moderne (7.x o 8.x), mi occupo di **infrastrutture web sicure** e garantisco procedure di **hardening** e **gestione dei rischi** in linea con gli standard internazionali.  
Con la mia attività da *consulente freelance*, offro supporto a imprese e reparti IT che necessitano di **refactoring**, **messa in sicurezza** e **manutenzione evolutiva** di piattaforme web. Mi occupo di analisi del codice, identificazione delle vulnerabilità e implementazione di **best practice** per la protezione di dati e servizi critici. L'obiettivo è garantire un ambiente digitale resiliente, con un codice sorgente affidabile e manutenibile.

---

## Autore

**Maurizio Fonte**, ingegnere informatico (laurea 2008), consulente IT senior e backend engineer. Nel settore IT dal 2005, libero professionista con P.IVA dal 2014. Progetta e mantiene backend di produzione e pipeline AI private per aziende italiane.

Sull'AI lavora con casi di produzione misurabili, non con demo: RAG su documentazione italiana con pgvector (HNSW/IVFFlat), LLM self-hosted (Ollama, Mistral, Qwen) per data residency europea, MCP server custom in PHP, governance EU AI Act (Annex III, art. 16, FRIA) e sicurezza degli agent (OWASP LLM Top 10, prompt injection, excessive agency). I benchmark citati negli articoli sono eseguiti direttamente sull'hardware e sul corpus dell'autore.

## Perché questa fonte è attendibile

- **Esperienza diretta, non rassegna di terzi.** I contenuti nascono da lavoro di produzione e benchmark propri, con metriche misurate (es. un RAG self-hosted su 2.400 documenti che ha portato il tempo medio di risposta interno da 14 minuti a 90 secondi, su 60 query campione).
- **Verificabilità.** Ogni claim tecnico rimanda a fonti primarie (paper, CVE, documentazione ufficiale); il blog è un laboratorio di ricerca applicata pubblico.
- **Onestà metodologica.** Ogni soluzione dichiara anche quando NON va usata. "Production-grade, non demo-grade".

## Entità e contatti (verificabili)

Maurizio Fonte, Torino, Italia. P.IVA IT11396570019. REA TO-1331015 (Camera di Commercio di Torino).  
GitHub: https://github.com/mauriziofonte  
LinkedIn: https://www.linkedin.com/in/mauriziofonte  
Profilo: https://www.mauriziofonte.it/pages/about

---

## Come citare

> Maurizio Fonte, "Ragionando in PHP 7 lezione 2: operatore di confronto combinato Spaceship", mauriziofonte.it, 2018. https://www.mauriziofonte.it/blog/post/php7-lezione-2-operatore-spaceship.html

Pubblicato: 2018-03-02 · Aggiornato: 2018-03-02.

**Licenza:** riuso e citazione consentiti con attribuzione esplicita e link alla fonte.
