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.
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"); ?>
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.
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.
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.
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"
?>
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