Menu

Costanti PHP: define() vs const e costanti magiche

Una costante PHP è un nome per un valore che non può cambiare: const MAX_USERS = 100; oppure define('MAX_USERS', 100);. Impara define vs const, costanti array, costanti di classe con self::, il controllo con defined() e le costanti magiche __LINE__, __FILE__, __DIR__ e __CLASS__.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Una costante è un nome per un valore che non cambia mai mentre lo script è in esecuzione. Dichiarala con const MAX_USERS = 100; oppure define('MAX_USERS', 100);, poi usa il nome da solo, senza $.

Per convenzione i nomi delle costanti sono in UPPER_SNAKE_CASE. Sono globali: una costante dichiarata in cima a un file è visibile dentro ogni funzione senza global.

define() vs const

Entrambi creano una costante, ma lavorano in momenti diversi. const viene risolto quando PHP compila il file, define() viene eseguito come qualsiasi altra chiamata di funzione.

constdefine()
Dentro if, cicli, funzioniNoSì
Nome costruito da una variabileNoSì
Costanti di classeSìNo
Il valore può essere un'espressioneSì, di costanti e letteraliSì, qualsiasi valore
Namespace applicato automaticamenteSìNo (indica il nome completo)

Usa const come scelta predefinita, perché è più breve e viene verificato in fase di compilazione. Usa define() quando la costante dipende da una condizione o da un nome calcolato.

Le costanti non si possono modificare

Assegnare un valore a una costante è un errore di parsing:

<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error:  syntax error, unexpected token "=" in /home/index.php on line 3

Definire due volte la stessa costante non è un errore, ma PHP stampa un warning e mantiene il primo valore:

<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3

Quando un valore potrebbe essere già impostato (per esempio in un file di configurazione caricato più di una volta), controlla prima con defined():

Costanti array

Una costante può contenere un array. Puoi leggerla con NAME[key], scorrerla con un ciclo e passarla in giro, ma non modificarla.

Costanti di classe

Dentro una classe, const dichiara una costante che appartiene alla classe. Leggila con ClassName::NAME dall'esterno e con self::NAME o static::NAME dall'interno. Le costanti di classe possono avere una visibilità, possono essere final e da PHP 8.3 possono dichiarare un tipo.

Un gruppo di costanti di classe correlate come STATUS_NEW e STATUS_PAID spesso si scrive meglio come enum, che impedisce anche di far circolare valori non validi.

Costanti magiche: LINE, FILE, DIR e altre

Le costanti magiche cambiano valore a seconda di dove compaiono. Vengono riempite in fase di compilazione.

La più usata è __DIR__, la cartella del file corrente. Costruire i percorsi degli include a partire da essa li fa funzionare indipendentemente dalla cartella da cui è stato avviato lo script: require __DIR__ . '/config.php';. Vedi include e require per lo schema completo.

Costanti predefinite da conoscere

PHP definisce molte costanti proprie. Queste compaiono di continuo:

PHP_EOL è il fine riga del sistema su cui gira PHP ("\n" su Linux e macOS, "\r\n" su Windows). Serve per il testo scritto su file e nel terminale; nell'output HTML un a capo non si vede, quindi lì usa <br>.

Domande frequenti

Qual è la differenza tra define() e const in PHP?

const è un costrutto del linguaggio risolto quando il file viene compilato: funziona al livello principale e dentro le classi, ma non dentro if, cicli o funzioni. define() è una funzione chiamata a runtime, quindi funziona ovunque e il nome può essere costruito da una variabile, ma non può dichiarare costanti di classe.

Una costante PHP può essere un array?

Sì. Funzionano sia const COLORS = ['red', 'green']; sia define('COLORS', ['red', 'green']);, e un elemento si legge con COLORS[0]. L'array non può essere modificato in seguito.

Come verifico se una costante è definita in PHP?

Usa defined('NAME'), che riceve il nome come stringa e restituisce true o false. Uno schema comune è if (!defined('APP_ENV')) { define('APP_ENV', 'production'); }. Per le costanti di classe passa 'ClassName::NAME'.

Cosa sono le costanti magiche in PHP?

Costanti il cui valore dipende da dove sono scritte: __LINE__ (riga corrente), __FILE__ (percorso completo del file), __DIR__ (la sua cartella), __FUNCTION__, __CLASS__, __METHOD__ e __NAMESPACE__. Si scrivono con due underscore per lato e non distinguono maiuscole e minuscole.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA