Un'altra aggiunta interessante è che ora è possibile definire costanti di classe, accedendovi utilizzando l'operatore usato per le proprietà o i metodi statici:
<?php
class Prova
{
const MIA_COSTANTE = 'valore';
}
echo Prova::MIA_COSTANTE;
?>
Un'altra funzionalità molto interessante, che prima era utilizzabile solamente attraverso l'estensione overload ma ora è built-in, è la possibilità di definire dei metodi particolari per catturare tutte le richieste in lettura/scrittura alle proprietà e le chiamate ai metodi, nel caso non fossero trovati nell'albero dei simboli di una classe.
Vediamo un semplice esempio:
<?php
class Prova
{
public $prova;
private $data;
public function __construct()
{
$this->data = array();
}
public function __set($name, $value)
{
echo Scritta la proprietà .$name.<br/>;
$this->data[$name] = $value;
}
public function __get($name)
{
echo Richiesta la proprietà .$name.<br/>;
return $this->data[$name];
}
public function test()
{
echo test method;
}
public function __call($name, $args)
{
echo Richiamato il metodo .$name. con .count($args). argomenti;
}
}
$prova = new Prova;
$prova->prova = 10;
echo $prova->prova;
$prova->ciao = ciao;
echo $prova->ciao;
$prova->metodoInesistente(1, 2, 3, 4, array());
?>
Prima di terminare questa breve trattazione della programmazione ad oggetti, vorrei parlare di un aggiunta fatta a PHP che permette di caricare automaticamente i file contenenti le definizioni delle classi nel momento in cui non vengano trovate in fase di esecuzione. PHP richiama automaticamente la funzione __autoload quando non trova una classe:
<?php
function __autoload($classname)
{
echo Classe richiesta: .$classname;
require_once $classname..php;
}
$prova = new Prova();
?>
Ovviamente utilizzare direttamente il nome della classe non è un sistema corretto. Ricordiamoci sempre di controllare che il path risultante o richiesto sia realmente accessibile e sia corretta la sua richiesta.