Sintassi

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.

Example #1 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.
?>

Example #2 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.

Vedere anche:

add a note

User Contributed Notes 2 notes

up
35
souzanicolas87 at gmail dot com
2 years ago
the documentation doesn't go too far in explaining the crucial difference between the two ways of declaring constants in PHP.

Const is handled at compile time, define() at run time. For this reason, a constant cannot be conditionally defined using Const, for example.

Another difference we can notice occurs in the constant declarations in classes. Const infiltrates the class scope, while define() leaks into the global scope.

<?php

Class Myclass (){
const
NAME = "Nicolas";
}

?>

The NAME constant is within the scope of the MyClass class.
up
9
login at (two)view dot de
7 years ago
Just a quick note:
From PHP7 on you can even define a multidimensional Array as Constant:

define('QUARTLIST',array('1. Quarter'=>array('jan','feb','mar'),'2.Quarter'=>array('may','jun','jul'));

does work as expected.
To Top