Le Costanti PHP: Una Guida Approfondita
Una costante in PHP è un valore che non può essere modificato una volta impostato. Le costanti sono fondamentali nella programmazione PHP.
Una costante in PHP è un valore con nome che non può essere modificato una volta definito. A differenza delle variabili, le costanti non sono precedute dal simbolo $, sono automaticamente disponibili ovunque nello script (nessuna regola di scope), e qualsiasi tentativo di riassegnarle viene ignorato o genera un errore. Sono ideali per valori fissi come impostazioni di configurazione, chiavi API, numeri di versione e limiti matematici.
Questo capitolo tratta come definire le costanti in due modi diversi, le differenze pratiche tra di essi, le costanti magiche, le costanti di classe e le insidie più comuni.
Definire una costante
PHP mette a disposizione due strumenti: la funzione define() e la parola chiave const. Entrambi accettano un nome e un valore.
<?php
// Using define()
define("SITE_NAME", "W3docs");
// Using the const keyword
const VERSION = "8.4";
echo SITE_NAME; // W3docs
echo PHP_EOL;
echo VERSION; // 8.4Per convenzione, i nomi delle costanti si scrivono in MAIUSCOLO, ma PHP non lo impone. Un nome valido inizia con una lettera o un underscore, seguito da lettere, numeri o underscore — esattamente come un nome di variabile, ma senza il $.
Si noti che si fa riferimento a una costante con il suo nome semplice (SITE_NAME), non con il $. Le costanti distinguono tra maiuscole e minuscole: SITE_NAME e site_name sono due costanti diverse.
const vs define()
Producono lo stesso tipo di costante ma si comportano diversamente a livello linguistico. Sapere quale utilizzare evita bug sottili:
const | define() | |
|---|---|---|
| Valutato a | Tempo di compilazione | Tempo di esecuzione |
Utilizzabile dentro if/cicli/funzioni | No (solo livello superiore / corpo di classe) | Sì |
| Il nome può essere costruito dinamicamente | No | Sì (è solo un argomento stringa) |
| Funziona dentro le classi | Sì (definisce una costante di classe) | No |
Poiché define() viene eseguito in fase di esecuzione, è la scelta giusta quando una costante deve esistere solo in determinate condizioni:
<?php
if (!defined("DEBUG")) {
define("DEBUG", true);
}
// define() can build the name dynamically — const cannot:
$key = "MAX_USERS";
define($key, 100);
echo MAX_USERS; // 100const, valutato in fase di compilazione, è più veloce ed è la scelta convenzionale per le costanti di primo livello nel codice moderno.
Verificare e leggere le costanti
Prima di usare una costante la cui esistenza è incerta, verificarla con defined(). Per ottenere il valore di una costante quando si dispone solo del suo nome come stringa, usare constant():
<?php
define("TIMEOUT", 30);
if (defined("TIMEOUT")) {
echo constant("TIMEOUT"); // 30
}Le costanti possono contenere array
Da PHP 7, le costanti non sono limitate agli scalari (int, float, string, bool) — possono contenere anche array. Questo è utile per tabelle di ricerca fisse:
<?php
const ALLOWED_ROLES = ["admin", "editor", "viewer"];
echo ALLOWED_ROLES[1]; // editorVedere Tipi di Dati PHP per scoprire cosa può memorizzare ogni tipo di valore.
Costanti magiche
PHP include le costanti magiche — nomi predefiniti il cui valore cambia a seconda di dove vengono utilizzate. Si scrivono con doppio underscore iniziale e finale:
| Costante | Restituisce |
|---|---|
__LINE__ | Il numero di riga corrente |
__FILE__ | Il percorso completo del file |
__DIR__ | La directory del file |
__FUNCTION__ | Il nome della funzione corrente |
__CLASS__ | Il nome della classe corrente |
__METHOD__ | Il nome del metodo della classe |
<?php
function greet() {
echo "Called from: " . __FUNCTION__ . PHP_EOL;
echo "On line: " . __LINE__ . PHP_EOL;
}
greet();Costanti di classe
Le costanti dichiarate all'interno di una classe appartengono alla classe stessa, non a nessuna istanza. Si dichiarano con const e si accede ad esse con l'operatore :: (risoluzione dello scope):
<?php
class Circle {
const PI = 3.14159;
public function area(float $r): float {
return self::PI * $r * $r;
}
}
echo Circle::PI; // 3.14159
echo PHP_EOL;
echo (new Circle)->area(2); // 12.56636Per un approfondimento, leggere Costanti di Classe PHP.
Costanti vs variabili
Le due servono scopi diversi. Una variabile contiene dati che si prevede cambino; una costante blocca un valore in modo permanente. I contrasti principali:
| Variabile | Costante | |
|---|---|---|
| Prefisso | $nome | NOME (nessun segno) |
| Riassegnabile | Sì | No |
| Scope | Locale a meno che non sia resa globale | Globale automaticamente |
| Distingue maiuscole/minuscole | Sì | Sì |
Utilizzare una costante ogni volta che un valore è destinato a rimanere fisso per tutta l'esecuzione — flag di configurazione, limiti, stringhe fisse — così non può essere accidentalmente sovrascritta altrove.
Insidie comuni
- Ridefinire una costante. Chiamare
define()due volte sullo stesso nome genera un avviso e mantiene il primo valore; ridichiarare conconstè un errore fatale. Le costanti sono scrittura unica. - Dimenticare che il
$è assente. Scrivereecho $SITE_NAMEcerca una variabile non definita, non la propria costante. - Costanti non definite. In PHP 8+, usare una costante bare-word non definita genera un
Error. Definire sempre prima di usare, oppure proteggere condefined().
Conclusione
Le costanti PHP offrono un modo sicuro per memorizzare valori che non devono mai cambiare: definirle con const per i valori ordinari di primo livello o con define() quando si ha bisogno di logica a runtime o di un nome dinamico, raggruppare i dati fissi in costanti array o di classe, e fare affidamento sulle costanti magiche integrate per il debug. Usate correttamente, mantengono la configurazione in un unico posto e prevengono le riassegnazioni accidentali.