Nella precedente lezione abbiamo analizzato l'utilizzo di alcune delle funzioni di introspezione in PHP.
In questa lezione parleremo di Reflection in PHP, ovvero una metodologia con la quale chiedere ad un oggetto
delle informazioni riguardanti i suoi metodi ed i suoi attributi.
PHP, supporta la riflessione mediante l'API Reflection, la quale mette a disposizione un gran numero
di metodi e di classi, utili alla Reflection.
PHP, a partire dalla versione 5, fornisce la classe ReflectionClass
, con cui effettuare operazioni
di riflessione su classi, metodi e interfacce e per estrarre le informazioni su tutti i componenti di una classe.
Esempio pratico di Reflection in PHP
In questo esempio utilizzeremo le stesse dichiarazioni delle classi Sample
e Student
e dell'interfaccia Person
impiegate nel precedente capitolo:
<?php
// dichiarazione della classe Introspezione
class Introspezione
{
// metodi
public function note() {
echo "Superclasse della classe Sample<br />";
}
}
// definizione della sottoclasse Sample
class Sample extends Introspezione
{
public function note() {
echo "Classe: ".get_class($this),"<br />";
echo "Classe di derivazione: ".get_parent_class($this), "<br />";
}
}
interface Person {
// costanti
const COSTANTE = "valore";
// definizione dei metodi
public function getName();
public function setName($name, $lastname);
}
class Student implements Person {
public $name = "";
public $lastname = "";
// implementazione dei metodi
public function getName(){
// corpo del Metodo
echo "$this->name $this->lastname";
}
public function setName($name, $lastname){
// corpo del Metodo
$this->name = $name;
$this->lastname = $lastname;
}
}
// istanziamo la ReflectionClass, passando come parametro nel costruttore il nome della classe.
$sample = new ReflectionClass("Sample");
// restituisce il nome della classe genitore di un oggetto o di una classe
$parent = $sample->getParentClass();
echo $sample->getName() . " è una sottoclasse di " . $parent->getName() . "<br />";
$reflection = new ReflectionClass("Student");
$interfaceNames = $reflection->getInterfaceNames();
if (in_array("Person", $interfaceNames)) {
echo "<br />Student implements Person<br />";
}
// ReflectionClass::getMethods - i metodi relativi a quella classe
$methods = $reflection->getMethods();
echo "<br />Sono disponibili i seguenti metodi:<br />";
print_r($methods);
// ReflectionClass::getConstants - array associativo contenente i nomi e i valori delle costanti
$constants = $reflection->getConstants();
echo "<br /><br />Sono disponibili le seguenti costanti:<br />";
foreach ( $constants as $name => $value ) {
echo $name . '=>' . $value . PHP_EOL;
}
// ReflectionClass::hasMethod - (Controllo se un metodo è definito in una classe)
if ($reflection->hasMethod("setName")) {
echo "<br /><br />Il metodo setName() esiste per Student";
}
?>
L'output HTML generato dal codice sarà il seguente:
Sample è una sottoclasse di Introspezione <br />
Student implements Person<br />
Sono disponibili i seguenti metodi:<br />
Array ( [0] => ReflectionMethod Object ( [name] => getName [class] => Student ) [1] => ReflectionMethod Object ( [name] => setName [class] => Student ) )
<br /><br />
Sono disponibili le seguenti costanti:<br />
COSTANTE=>valore
<br /><br />
Il metodo setName() esiste per Student
Nell'esempio precedente, abbiamo poi istanziato la ReflectionClass
, passando come parametro nel costruttore
il nome della classe. Poi, abbiamo richiamato i metodi (alcuni dei tanti a disposizione) relativi alla classe ReflectionClass
.
Il metodo getInterfaceNames()
restituisce un array con il nome dell'interfaccia
che implementa la classe. Per visualizzare il nome dell'oggetto ReflectionClass
si utilizza, come visto nel precedente capitolo,
il metodo GetName()
. Il metodo getMethods()
restituisce un array di oggetti di tipo ReflectionMethod
e
un parametro (opzionale) per filtrare i risultati in base a metodi con determinati attributi:
ReflectionMethod::IS_STATIC, IS_PUBLIC, IS_PROTECTED, IS_PRIVATE, IS_ABSTRACT, e IS_FINAL.
Infine, il metodo getConstants
, resituisce un array associativo contenente i nomi e i valori delle costanti.