Una costante è un identificatore (nome) per un valore. Come si può intuire, tale valore non può cambiare durante l'esecuzione dello script (fanno eccezione le costanti magiche, che, in realtà, non sono costanti). Le costanti sono "case-sensitive". È convenzione comune che gli identificatori delle costanti siano sempre maiuscoli.

Nota: Prima di PHP 8.0.0, le costanti definite utilizzando la funzione define possono non fare distinzione tra maiuscole e minuscole.

In PHP il nome di una costante segue le regole di qualsiasi "etichetta". Un nome di costante valido inizia con una lettera o underscore, seguita da un numero qualsiasi di caratteri alfanumerici o underscore. L'espressione regolare che esprime questa convenzione è: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$

È possibile eseguire la funzione define per definire costanti con nomi riservati o addirittura non validi, il cui valore può essere recuperato solo con la funzione constant. Tuttavia, non è consigliabile farlo.

Nomi di costanti validi ed errati <?php // Nomi validi define("FOO", "something"); define("FOO2", "something else"); define("FOO_BAR", "something more") // Nomi di costante errati define("2FOO", "something"); // Nomi validi, ma da evitare: // un domani potrebbero essere utilizzati dal PHP per fornire costanti magiche // e quindi si avrebbero problemi nello script define("__FOO__", "something"); ?>

Nota: In questo contesto una lettera è a-z, A-Z e i caratteri ASCII dal 128 al 255 (0x80-0xff).

Come le Link superglobals, costante è sempre globale. Si può accedere alle costanti da qualsiasi punto dello script senza tenere conto della visibilità. Per maggiori dettagli sulla visibilità, leggere la sezione scope della variable.

Nota: A partire da PHP 7.1.0, le costanti di classe possono dichiarare una visibilità protetta o privata, rendendole disponibili solo nello scope gerarchico della classe in cui è definita.

Le costanti possono essere definite utilizzando la parola chiave const o utilizzando la funzione define. Mentre define permette di definire una costante in un'espressione arbitraria, la parola chiave const ha delle restrizioni come descritto nel paragrafo successivo. Una volta definita, una costante non può mai essere modificata o non definita.

Quando si utilizza la parola chiave const, sono accettate solo espressioni scalari (bool, int, float e string) e array costanti contenenti solo espressioni scalari. È possibile definire costanti come una resource, ma questo dovrebbe essere evitato, poiché può causare risultati inaspettati.

Si accede al valore di una costante semplicemente specificandone il nome. A differenza delle variabili, una costante non è preceduta da un $. È anche possibile utilizzare la funzione costant per leggere il valore di una costante se il nome della costante è ottenuto dinamicamente. Si utilizzi get_defined_constants per ottenere una lista di tutte le costanti definite.

Nota: Costanti e variabili (globali) si trovano in un "namespace" differente. Questo implica che generalmente true e $TRUE sono differenti.

Se si utilizza una costante non definita, viene generato un Error. Prima di PHP 8.0.0, le costanti non definite venivano interpretate come una semplice parola string, ovvero (COSTANTE vs "COSTANTE"). Questo fallback è deprecato a partire da PHP 7.2.0, e quando si verifica viene emesso un errore di livello E_WARNING. Prima di PHP 7.2.0, è stato invece emesso un errore di livello E_NOTICE. Si veda anche la voce del manuale sul perché $foo[bar] è sbagliato (a meno che bar sia una costante). Questo non si applica alle costanti qualificate (completamente), che genereranno sempre un Error se non definite.

Nota: Per verificare che una costante sia impostata, utilizzare la funzione defined.

Di seguito sono riportate le principali differenze rispetto le variabili: Le costanti non iniziano con il segno del dollaro ($); Le costanti possono essere definite e utilizzate ovunque senza seguire le regole di visibilità; Una volta impostate, le costanti non posso essere redefinite e né annullate; Le costanti possono essere valutate solo come valori scalari o array.

Definizione di costanti <?php define("COSTANTE", "Ciao mondo."); echo COSTANTE; // stampa "Ciao mondo." echo Costante; // Emette un errore: Undefined constant "Constant" // Prima di PHP 8.0.0, stampa "Constant" ed emette un avviso. ?>

Definizione di Costanti utilizzando la parola chiave const <?php // Valore scalare semplice const CONSTANT = 'Hello World'; echo CONSTANT; // Espressione scalare const ANOTHER_CONST = CONSTANT.'; Goodbye World'; echo ANOTHER_CONST; const ANIMALS = array('dog', 'cat', 'bird'); echo ANIMALS[1]; // visualizza "cat" // Array costanti define('ANIMALS', array( 'dog', 'cat', 'bird' )); echo ANIMALS[1]; // visualizza "cat" ?>

Nota: Al contrario di definire costanti utilizzando define, le costanti definite utilizzando la parola chiave const devono essere dichiarate nella scope del livello superiore perchè sono definite in fase di compilazione. Questo significa che non possono essere dichiarate all'interno di funzioni, cicli, istruzioni if oppure blocchi try/ catch.

PHP fornisce un grande numero di costanti predefinite per qualsiasi script che viene eseguito. Molte di queste costanti, comunque, sono create da varie estensioni, e saranno presenti solo quando queste estensioni sono disponibili, sia perchè vengono caricate dinamicamente e sia perchè sono state compilati in PHP.

Ci sono nove costanti magiche che cambiano in base a dove vengono utilizzate. Per esempio, il valore di __LINE__ dipende dalla linea che sta utilizzando nel tuo script. Tutte queste costanti "magiche" vengono risolte in fase di compilazione, a differenza delle costanti regolari, che vengono risolte in fase di esecuzione. Queste costanti speciali non fanno distinzione tra maiuscole e minuscole e sono le seguenti:

Costanti magiche di PHP Name Description __LINE__ Il numero della riga corrente del file. __FILE__ Il percorso completo e il nome del file con i link simbolici risolti. Se utilizzato all'interno di un'inclusione, viene restituito il nome del file incluso. __DIR__ La cartella del file. Se utilizzato all'interno di un'inclusione, viene restituita la cartella del file incluso. Questo è equivalente a dirname(__FILE__). Il nome della cartella non ha slash a meno che non sia la directory root. __FUNCTION__ Il nome della funzione, o {closure} per le funzioni anonime. __CLASS__ Il nome della classe. Il nome della classe include il namespace in cui è stata dichiarata (es. Foo\Bar). Quando usata in un metodo trait, __CLASS__ è il nome della classe in cui il trait è usato. __TRAIT__ Il nome del trait. Il nome del trait include il namespace in cui è stato dichiarato (es. Foo\Bar). __METHOD__ Il nome del metodo della classe. __NAMESPACE__ Il nome del namespace corrente. ClassName::class Il nome completo della classe.

::class get_class get_object_vars file_exists function_exists