In PHP, come in altri linguaggi di sviluppo e programmazione, è possibile definire delle costanti, ovvero dei valori fissi che non possono cambiare e vengono quindi mantenuti per tutta la durata dello script o dell'applicazione. Rispetto alle variabili, dalle quali si differenziano sia sintatticamente che funzionalmente, le costanti devono rispettare le seguenti regole:
- il nome delle costanti non inizia mai con il simbolo
$
, ma deve sempre iniziare con una lettera o con un underscore, seguita da caratteri alfanumerici o underscore; - esse non vengono definite mediante assegnazione, ma tramite la funzione
define()
, quest'ultima accetta due parametri: il nome della costante e il valore da associare ad essa; - sono case-sensitive, per un fattore di consuetudine nella programmazione, il nome di una costante è sempre maiuscolo;
- i valori ammessi per le costanti devono essere di tipo scalare (quindi integer, float, string o boolean) o null;
- la visibilità delle costanti è globale. Possono essere utilizzate in qualsiasi punto del programma;
- come anticipato, una volta definite non possono essere modificate.
Le costanti sono utilizzate, ad esempio, nei file di configurazione, dove le stesse conterranno le informazioni necessarie per la connessione ad un database, ma gli ambiti di adozione sono molteplici; di seguito un esempio riguardante la definizione e l'utilizzo di una costante (SITE
):
<?php
define("SITE", "Html.it");
echo SITE; // stampa "Html.it"
echo Site; // genera una notifica come per esempio: notice: Use of undefined constant Site - assumed 'Site' in C:\xampp\htdocs\temp\test.php on line 4
?>
È possibile visualizzare tutte le costanti utilizzate tramite la funzione get_defined_constants()
:
<?php
define("SITE", "Html.it");
print_r(get_defined_constants(true));
?>
analogamente è possibile verificare se una costante è stata definita:
<?php
if(defined("SITE")){
echo "Costante definita";
}
?>
Le costanti predefinite
Le costanti predefinite, fornite dal core PHP o dai suoi moduli (estensioni), sono utili per accedere a informazioni (di sola lettura) in qualsiasi script eseguito. A differenza delle costanti normali, le quali si definiscono con define()
, le costanti predefinite hanno un nome che richiama la libreria associata.
Ad esempio, le costanti per la gestione degli errori (Error Handling), iniziano tutte con E_*
e sono utilizzate insieme alla funzione error_reporting()
per impostare il livello di errori da visualizzare.
Di seguito, un esempio di alcune costanti predefinite (costanti magiche) messe a disposizione da PHP:
<?php
echo "la directory e il nome del file: " . __FILE__;
// stampa: la directory e il nome del file: C:\xampp\htdocs\temp\test.php
echo "la directory di questo file: " . __DIR__;
// stampa: la directory di questo file: C:\xampp\htdocs\temp
echo "linea numero " . __LINE__ . ".\n";
// stampa la linea corrente del file
?>
Le costanti di classe
A partire da PHP 5, è possibile definire, tramite la parola chiave const
seguita dal nome e dal valore della costante stessa, una costante all'interno di una classe.
A differenza delle proprietà e dei metodi, le costanti, appartengono alla classe e non alle sue istanze. Quindi, per riferirsi alle costanti dall'interno della classe non è possibile utilizzare la keyword $this
, né si può ricorrere all'operatore di deferenziamento ("->") per riferirsi dall'esterno.
<?php
class Sample {
// costanti
const NERO = "Nero";
const AZZURRO = "Azzurro";
public function getConsts() {
echo "<br />" . " Il valore contenuto nella costante NERO: " . self::NERO;
echo "<br />" . " Il valore contenuto nella costante AZZURRO: " . Sample::AZZURRO;
}
}
$myClass = new Sample();
// stampa...
// Il valore contenuto nella costante NERO: Nero
// Il valore contenuto nella costante AZZURRO: Azzurro
$myClass->getConsts();
// stampa Nero
echo "<br />" . Sample::NERO;
// errore - non è possibile accedere al valore di una costante tramite le istanze della classe
echo "<br />" . $myClass::A;
?>
In questo esempio, abbiamo visto come accedere alla costante sia all'interno del metodo getConsts()
tramite la parola chiave self
seguita dall'operatore di risoluzione di scope (::
)
<?php
public function getConsts() {
echo "<br />" . " Il valore contenuto nella costante NERO: " . self::NERO;
echo "<br />" . " Il valore contenuto nella costante AZZURRO: " . Sample::AZZURRO;
}
?>
sia tramite il nome della classe seguito dall'operatore di risoluzione di scope
<?php
echo MyClass::A;
?>
Conclusioni
Nella prossima lezione, affronteremo le strutture complesse che sono formate dalla combinazione di più classi che prendono il nome di gerarchie di classi, ed osserveremo come sia possibile condividere informazioni e risorse per creare applicazioni modulari.