Le costanti in PHP: introduzione, esempi, funzione define e const

In PHP è possibile definire delle costanti per assegnare o contenere un valore semplice. Come suggerisce il nome stesso, non è possibile cambiare il valore di una costante durante l’esecuzione di un programma. Facendo ciò otterremmo un errore.

Nel corso degli anni PHP si è evoluto permettendo di:

  • definire le costanti con il costrutto const e non solo con la funzione define()
  • a partire dalla versione PHP 7.0 le costanti possono contenere anche gli array oltre a stringhe, numeri interi o decimali e booleani
  • a partire dalla versione PHP 7.3 lo sviluppatore può decidere se rendere i nomi delle costanti definite non sensibili alle maiuscole o alle minuscole

Definire una costante

Per definire una costante utilizziamo la funzione define():

<?php define( "NOME_COSTANTE", "Valore costante" ); ?>

Possiamo utilizzare il costrutto echo per mostrare il valore di una costante:

<?php echo NOME_COSTANTE; ?>

Risultato:

Valore costante

Potevo utilizzare anche i tag <?= ?>:

<?= NOME_COSTANTE; ?>

Devi fare attenzione quando definisci il nome di una costante perché:

  • Il nome della costante nella funzione define("NOME_COSTANTE", "Valore") deve essere tra doppi apici
  • Il nome di una costante NON inizia col simbolo del dollaro
  • deve iniziare con una lettera “a-z” maiuscola o minuscola o con il simbolo underscore “_
  • il resto dei caratteri del nome di una costante possono essere una lettera “a-z” maiuscola o minuscola, un numero “0-9” o il simbolo underscore “_

Non puoi iniziare il nome di una costante con un numero e non sono ammessi spazi vuoti.

Ecco alcuni esempi di costanti definite in modo corretto e non:

<?php

// Costanti definite in modo corretto
define( "_NOME_COSTANTE", "Un valore qualsiasi" );
define( "NOMECOSTANTE", "Un altro valore" );
define( "_3NOME_COSTANTE", "Valore costante" );
define( "NOME_2_COSTANTE", "Valore costante 2" );
define( "COSTANTE_5735857395", "Valore costante 3" );

// Costanti definite in modo NON corretto
define( "5COSTANTE", "Valore");
define( "NOME COSTANTE", "Valore");
define( "57_COSTANTE", "Valore");

?>

Per convenzione scriviamo il nome di ogni costante in lettere maiuscole.

Una costante può contenere un valore di tipo:

  • string (stringa)
  • int (numero intero)
  • float (numero decimale)
  • bool (valore booleano)

Ecco alcuni esempi:

<?php

// Costanti con stringhe di testo
define( "STRING", "Stringa di testo" );

// Costanti con numeri interi
define( "INT_1", 6949 );
define( "INT_2", 3 );
define( "INT_3", 36849 );
define( "INT_4", -69 );
define( "INT_5", -7 );

// Costanti con numeri decimali
define( "FLOAT_1", 2.5);
define( "FLOAT_2", 57.582);
define( "FLOAT_3", -9.84);
define( "FLOAT_4", -689.53);

// Costanti con valori booleani
define( "BOOL_1", true );
define( "BOOL_2", false );

?>

Dalla versione PHP 7.0 una costante può contenere anche array.

Possiamo definire un array in una costante con il costrutto array() o con le parentesi quadre []:

<?php

define( "ARRAY_1", array(0, 1, 2, 3, 4) );

define( "ARRAY_2", ["stringa", 56, -53, true] );

?>

Per ottenere il valore di un array dentro a una costante utilizziamo la sintassi a parentesi quadre e definendo il numero dell’indice al loro interno del valore che vogliamo:

<?php 

echo ARRAY_1[0];    // output -> 0

echo "<br>";

echo ARRAY_1[1];    // output -> 1

echo "<br>"; 

echo ARRAY_2[0];    // output -> stringa

?>

All’interno di una costante posso definire anche un array associativo:

<?php

define("ARRAY_ASSOCIATIVO", array(
	"nome" => "Michele",
        "cognome" => "Mincone",
        "eta" => 20,
        "occupato" => true,
));

?>

Per ottenere un valore utilizzo le parentesi quadre e dentro di esse la chiave del valore che desidero:

<?php

echo ARRAY_ASSOCIATIVO["nome"];    // output -> Michele

echo "<br>";

echo ARRAY_ASSOCIATIVO["cognome"];    // output -> Mincone

echo "<br>";

echo ARRAY_ASSOCIATIVO["eta"];    // output -> 20

?>

I nomi delle costanti sono sensibili alle maiuscole e alle minuscole:

<?php

define("COSTANTE", "Stringa di testo");

echo COSTANTE; // output -> Stringa di testo

// Qui sotto ottengo un errore
echo costante;
echo Costante;
echo COSTante;

?>

Però è possibile rendere le costanti NON sensibili a maiuscole e minuscole inserendo come terzo parametro della funzione define() il valore booleano true;

<?php

// Rendo il nome di questa costante non sensibile a maiuscole e minuscole
define("COSTANTE", "Stringa di testo", true);

echo COSTANTE; // output -> Stringa di testo

// Ora posso chiamare la costante anche in questo modo
echo costante;
echo Costante;
echo COSTante;

?>

Definire una costante con const

Posso definire una costante anche con il costrutto const e inserendo successivamente un nome che deve iniziare o con una lettera maiuscola o minuscola o il simbolo underscore.

Quindi vale la stessa

<?php

// Costanti valide
const COSTANTE = "Questa è una costante definita con il costrutto const";

const STRINGA = "Sono una stringa di testo";

const NUMERO_INTERO_1 = 786;
const NUMERO_INTERO_2 = -6;

const NUMERO_DECIMALE_1 = 6.3;
const NUMERO_DECIMALE_2 = -8.78;

const BOOL_1 = true;
const BOOL_2 = false;

const ARRAY_1 = array(1, -2, true, false, "testo", 66.2);
const ARRAY_2 = [1, 5, 6.4, -5, true, "testo"];

const ARRAY_ASSOCIATIVO = array(
    "nome" => "Michele",
    "cognome" => "Mincone"
);

// Costanti NON valide
const 858COSTANTE = "Valore";
const 84_COSTANTE = 83;
const _COSTANTE 1 = 6.2;
const 4_COSTANTE_2 = 77;

?>

Anche qui posso definire costanti che contengono: string, int, float, bool e array.

Utilizzo sempre il costrutto echo per ottenere il valore:

<?php

echo COSTANTE;    // output -> Questa è una costante definita con il costrutto const

echo "<br>";

echo STRINGA;    // output -> Sono una stringa di testo

echo "<br>";

echo NUMERO_INTERO_1;    // output -> 786

?>

Differenze tre define() e const

La parola define() è una funzione che accetta tre argomenti:

define(string $nomeCostante, string $valoreCostante, bool $sensibileAlleMinuscoleMaiuscole);

Essendo define() una funzione verrà eseguita in runtime.

Invece, se utilizzo il costrutto const la costante verrà definita durante la fase di compilazione.

Quindi, posso utilizzare la funzione define() assieme a un blocco condizionale. Ad esempio, verifichiamo se una costante è stata già definita con la funzione defined():

<?php

if ( !defined("LARGHEZZA") ) {
    define("LARGHEZZA", 1280);
}

echo LARGHEZZA;    // output -> 1280

?>

Quindi posso utilizzare la funzione defined() per verificare se una costante è stata già definita o meno.

Non posso fare la stessa cosa con il costrutto const:

<?php

if ( !defined("ALTEZZA") ) {
    const ALTEZZA = 1280;
}

echo ALTEZZA;

?>

Il codice qui sopra darà un errore!

La funzione define() ci permette anche di definire il nome delle costanti a partire dal valore di un’altra costante:

<?php

// Definiamo un prefisso
define( "NUMBER", "NUMERO" );

// Definiamo varie costanti utilizzando il prefisso qui sopra
define( NUMBER . "_1", "555 555 5555" );
define( NUMBER . "_2", "222 222 2222" );
define( NUMBER . "_3", "111 111 1111" );

?>

Questa operazione non possiamo eseguirla con il costrutto const.

Il valore di una costante non può cambiare

Per definizione, il valore di una costante non può cambiare nello script di un programma.

Concatenare più costanti

Come con le variabili, è possibile concatenare più costanti utilizzando il punto “.“, ecco un esempio:

<?php

// Definisco un po' di costanti alcune con la funzione define() e altre con const
define("MODELLO_TELEFONO_1", "iPhone 13");
define("RISOLUZIONE", "2532 x 1170");

const UNITA_MISURA_PX = "px";

// Costruisco una frase concatenando le costanti
echo "Lo smartphone " . MODELLO_TELEFONO_1 . " ha uno schermo con una risoluzione di " . RISOLUZIONE . " " . UNITA_MISURA_PX . ".";

?>

Risultato:

Lo smartphone iPhone 13 ha una risoluzione di 2532 x 1170 px.

Eseguire operazioni con le costanti

Posso eseguire operazioni a partire dalle costanti definite assieme alle variabili:

<?php

// Definiamo alcune costanti e una variabile
const IVA = 22;
const VALUTA = "€";

$prezzo_smartphone_no_iva = 499;

// Eseguiamo un'operazione dentro a una variabile
$totale = $prezzo_smartphone_no_iva + ($prezzo_smartphone_no_iva * (IVA / 100) );

// Aggiungiamo la valuta
$totale_con_valuta = $totale . ' ' . VALUTA;

// Elaboriamo una stringa
echo "Il prezzo di questo smartphone è " . $totale_con_valuta;

?>

Prenditi del tempo per analizzare questa porzione di codice.

Infine, ecco il risultato:

Il prezzo di questo smartphone è 608.78 €