W3docs

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 constant
class 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:

Caratteristicaconstdefine()
ValutataIn fase di compilazioneIn fase di esecuzione
Può essere usata condizionalmente (dentro if)No
Funziona dentro una classeSì (costante di classe)No
Nome da una variabile/espressioneNoSì (define($name, ...))
ValoreSolo espressioni costantiQualsiasi 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 John

Si 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;       // editor

Le 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; // pending

Anche 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 const in un if, un ciclo o una funzione basata su dati di runtime — usa define() per quello.
  • Le costanti hanno visibilità globale. Una const globale è visibile all'interno delle funzioni senza global, a differenza di una normale variabile.

Vantaggi

  • Leggibilità: una costante con un nome significativo come TAX_RATE documenta 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.

Esercitazione

Pratica
In PHP, quali delle seguenti affermazioni sulle costanti sono vere?
In PHP, quali delle seguenti affermazioni sulle costanti sono vere?
Was this page helpful?