const
La parola chiave const di PHP consente di dichiarare costanti globali e di classe che rimangono invariate durante l'esecuzione dello script.
La parola chiave PHP const
Una costante è un valore con un nome che non può cambiare durante l'esecuzione di uno script. La parola chiave const è uno dei due modi con cui PHP consente di dichiarare una costante (l'altro è la funzione define()). A differenza di una variabile, una costante non ha il prefisso $, e una volta impostata non è possibile riassegnarla né usare unset() su di essa.
Questa guida illustra cosa fa const, come si differenzia da define(), dove è consentito utilizzarla e le insidie più comuni in cui ci si può imbattere.
Sintassi
Puoi usare const al livello superiore di uno script (una costante globale) oppure all'interno di una classe, un'interfaccia o un trait (una costante di classe):
const NAME = value; // global constantclass ClassName {
const NAME = value; // class constant, accessed as ClassName::NAME
}Per convenzione, i nomi delle costanti vengono scritti in UPPER_SNAKE_CASE. Un nome deve iniziare con una lettera o un trattino basso e contenere solo lettere, cifre e trattini bassi.
const vs define()
PHP ti mette a disposizione due strumenti che sembrano simili ma si comportano in modo diverso. Conoscere le differenze fa risparmiare tempo nel debug:
| Caratteristica | const | define() |
|---|---|---|
| Valutata | In fase di compilazione | In fase di esecuzione |
Può essere usata condizionalmente (dentro if) | No | Sì |
| Funziona dentro una classe | Sì (costante di classe) | No |
| Nome da una variabile/espressione | No | Sì (define($name, ...)) |
| Valore | Solo espressioni costanti | Qualsiasi espressione |
Regola pratica: usa const per valori fissi e sempre definiti (specialmente costanti di classe), e define() quando il nome o il valore viene deciso durante l'esecuzione del programma.
<?php
// define() can be conditional; const cannot.
if (!defined('ENVIRONMENT')) {
define('ENVIRONMENT', 'production');
}
// This would be a fatal parse error — const cannot live inside an if-block:
// if (true) { const FOO = 1; }Per approfondire, consulta il capitolo dedicato a define() e la panoramica sulle costanti PHP.
Esempi
Costante di classe e costante globale
<?php
// Example 1 — a class constant referenced with self::
class Circle
{
const PI = 3.14;
public $radius;
public function __construct($radius)
{
$this->radius = $radius;
}
public function getArea()
{
return self::PI * $this->radius * $this->radius;
}
}
$myCircle = new Circle(5);
echo "Area of circle: " . $myCircle->getArea() . PHP_EOL;
// Output: Area of circle: 78.5
// Example 2 — a global constant
const MY_NAME = "John";
echo "My name is " . MY_NAME;
// Output: My name is JohnSi legge una costante di classe con l'operatore :: (scope resolution) — self::PI dall'interno della classe, Circle::PI dall'esterno. Una costante globale si usa direttamente per nome, senza $. Per ulteriori informazioni sulle classi, vedi classi e oggetti PHP e il capitolo sulle costanti di classe.
Espressioni costanti e array
Il valore di una const deve essere un'espressione costante — qualcosa che PHP può valutare senza eseguire alcun codice. Puoi usare letterali, operatori e altre costanti già definite, e (a partire da PHP 5.6) il risultato può essere un array.
<?php
const SECONDS_PER_MINUTE = 60;
const SECONDS_PER_HOUR = SECONDS_PER_MINUTE * 60; // built from another const
const ALLOWED_ROLES = ['admin', 'editor', 'viewer'];
echo SECONDS_PER_HOUR . PHP_EOL; // 3600
echo ALLOWED_ROLES[1] . PHP_EOL; // editorLe chiamate a funzioni e le istanze di oggetti non sono consentite nel valore di una const perché non possono essere risolte in fase di compilazione.
Costanti di classe: visibilità, interfacce e final
Le costanti di classe appartengono alla classe, non a un singolo oggetto, quindi non è necessaria un'istanza per leggerle. A partire da PHP 7.1 è possibile assegnare loro anche un modificatore di visibilità:
<?php
interface HasStatus
{
// Interface constants are always public.
const DEFAULT_STATUS = 'pending';
}
class Order implements HasStatus
{
public const TAX_RATE = 0.2; // readable everywhere
protected const MAX_QTY = 99; // this class + subclasses
private const SECRET = 'x'; // this class only
public function status(): string
{
return self::DEFAULT_STATUS; // inherited from the interface
}
}
echo Order::TAX_RATE . PHP_EOL; // 0.2
echo (new Order())->status() . PHP_EOL; // pendingAnche le interfacce possono dichiarare costanti (sempre pubbliche) — vedi interfacce PHP. Una costante di classe può essere contrassegnata come final (PHP 8.1+) per impedire alle sottoclassi di sovrascriverla.
Insidie comuni
- Nessun
$sulle costanti.echo MY_NAME;funziona;echo $MY_NAME;cerca una variabile e fallisce. - Non possono essere modificate o eliminate. Riassegnare una costante è un errore fatale;
unset()non funziona sulle costanti. - Solo in fase di compilazione. Non puoi racchiudere
constin unif, un ciclo o una funzione basata su dati di runtime — usadefine()per quello. - Le costanti hanno visibilità globale. Una
constglobale è visibile all'interno delle funzioni senzaglobal, a differenza di una normale variabile.
Vantaggi
- Leggibilità: una costante con un nome significativo come
TAX_RATEdocumenta l'intento molto meglio di un numero magico. - Manutenibilità: modifica un valore in un solo posto invece di cercare ogni letterale nel codice.
- Sicurezza: il valore è di sola lettura, quindi non può essere sovrascritto accidentalmente in nessuna parte del codice.
Conclusione
La parola chiave const definisce costanti in fase di compilazione — sia globali che all'interno di classi — che rimangono fisse per l'intera durata di uno script. Usala per valori fissi che conosci sempre in anticipo, preferisci le costanti di classe per valori che appartengono a un tipo, e passa a define() quando hai bisogno di una costante creata condizionalmente o con un nome dinamico. Per approfondire, continua con i capitoli sulle costanti PHP e le costanti di classe.